类型:数据库类大小:40.7米语言:中文评分:6.6标签:立即下载工具功能:可以实现SQL server2008、ACCESS 2007、ORACLE数据库的EXCEL2007导入、导出以及存储过程运算。源码及安装包下载地址:http://datapie.codeplex.com/
本篇文章,主要介绍下工具中多数据库导入导出功能的实现,以及获取不同数据库架构信息的一些方法。
1.分布性接口。
主要包含导入、导出、基本结构化查询语言操作方法的定义。具体方法的用途看其名称基本可以知道。
使用系统;
使用系统。数据;
使用系统。收藏品;
使用系统。集合。通用;
命名空间数据。数据访问层
{
公共接口分布
{
#地区执行结构化查询语言操作
///摘要
///运行结构化查询语言语句
////摘要
///参数名=' SQL '/参数
int ExecuteSql(字符串(SqL);
#endregion
#地区返回数据表对象
///摘要
///运行结构化查询语言语句,返回数据表对象
////摘要
数据表返回数据表(字符串SQL,int StartIndex,int页面大小);
///摘要
///运行结构化查询语言语句,返回数据表对象
////摘要
数据表返回数据表(字符串SQL);
#endregion
#地区存储过程操作
int RunProcedure(字符串storedProcedure名称);
#endregion
#地区获取数据库计划信息
///摘要
///获取数据库中数据库列表
////摘要
IListstring GetDatabaseInfo();
IListstring GetTableInfo();
IListstring GetColumnInfo(字符串TableName);
IListstring GetProcInfo();
IListstring GetViewInfo();
int ReturnTbCount(字符串TB _ name);
#endregion
#地区批量导入数据库
///摘要
///批量导入数据库
////摘要
bool SQL bulkcopyimport(IListstring maplist,string TableName,DataTable dt);
#endregion
}
}
2.数据库数据库对该接口的具体实现方法
///摘要
///运行结构化查询语言语句,返回数据表对象
////摘要
公共数据表返回数据表
{
使用(SqlConnection连接=新的SqlConnection(连接字符串))
{
DataTable dt=new DataTable();
尝试
{
连接open();
sqldatadapter命令=new sqldatadapter(SQL,连接);
命令。填充(dt);
}
捕捉(系统数据。sqlclient。sqlexception(ex)
{
抛出新的异常(例如。消息);
}
返回dt;
}
}
///摘要
///运行结构化查询语言语句,返回数据表对象
////摘要
公共数据表返回数据表(字符串SQL,int StartIndex,int PageSize)
{
使用(SqlConnection连接=新的SqlConnection(连接字符串))
{
DataTable dt=new DataTable();
尝试
{
连接open();
sqldatadapter命令=new sqldatadapter(SQL,连接);
命令。填充(开始索引,页面大小dt);
}
捕捉(系统数据。sqlclient。sqlexception(ex)
{
抛出新的异常(例如。消息);
}
返回dt;
}
}
//返回制定表名的行数
public int ReturnTbCount(字符串tb_name)
{
使用(SqlConnection连接=新的SqlConnection(连接字符串))
{
尝试
{
字符串SQL='从' tb_name '中选择计数(*);
连接open();
SqlCommand cmd=新的SqlCommand(SQL,连接);
(同Internationalorganizations)国际组织计数=int .解析(cmd .ExecuteScalar().ToString());
返回计数;
}
捕捉(系统数据。sqlclient。sqlexception(ex)
{
抛出新的异常(例如。消息);
}
}
}
#地区架构信息
///摘要
///根据条件,返回架构信息
////摘要
///param名称='collectionName '集合名称/param
///param name='restictionValues '约束条件/param
///returnsDataTable/returns
公共静态数据表GetSchema(字符串collectionName,字符串[] restictionValues)
{
使用(SqlConnection连接=新的SqlConnection(连接字符串))
{
DataTable dt=new DataTable();
尝试
{
dt .clear();
连接open();
dt=连接. GetSchema(collectionName,restictionValues);
}
捕捉
{
dt=null
}
返回dt;
}
}
///摘要
///返回指定名称的架构信息
////摘要
///param名称='collectionName '集合名称/param
///returnsDataTable/returns
公共静态数据表GetSchema(字符串集合名称)
{
使用(SqlConnection连接=新的SqlConnection(连接字符串))
{
DataTable dt=new DataTable();
尝试
{
dt .clear();
连接open();
dt=连接. GetSchema(collectionName);
}
捕捉
{
dt=null
}
返回dt;
}
}
public IListstring GetDatabaseInfo()
{
IListstring DatabaseList=new Liststring();
数据表dt=GetSchema('数据库');
int num=dt .行。计数;
if (dt .行数。计数0)
{
foreach(dt中的数据行_数据行项目).行)
{
数据库列表。添加(_DataRowItem['database_name']).ToString());
}
}
返回数据库列表
}
public IListstring GetTableInfo()
{
IListstring tableList=new Liststring();
字符串[] rs=新字符串[] { null,null,null,' BASE TABLE ' };
DataTable dt=GetSchema('tables ',RS);
int num=dt .行。计数;
if (dt .行数。计数0)
{
foreach(dt中的数据行_数据行项目).行)
{
表格列表.添加(_DataRowItem['table_name']).ToString());
}
}
返回表格列表
}
public IListstring GetColumnInfo(字符串表名)
{
字符串[]限制=新字符串[] { null,null,TableName };
数据表表信息=获取模式('列',限制);
IListstring List=new Liststring();
int count=tableinfo .行。计数;
如果(计数0)
{
//for(int I=0;我数;(一)
//{
//列表。添加(表信息.行[i]["列名"]。ToString());
//}
foreach(表格信息中的数据行_数据行项目).行)
{
列表。添加(_DataRowItem['列名'])。ToString());
}
}
退货清单;
}
public IListstring GetProcInfo()
{
IListstring List=new Liststring();
数据表dt=GetSchema('过程');
int num=dt .行。计数;
if (dt!=空dt .行数。计数0)
{
foreach(dt中的数据行_数据行项目).行)
{
if(_ DataRowItem[' routine _ type ']).ToString().ToUpper()!='FUNCTION ')
{列表。添加(_DataRowItem['routine_name']).ToString());}
}
}
退货清单;
}
public IListString GetFunctionInfo()
{
IListstring List=new Liststring();
数据表dt=GetSchema('过程');
int num=dt .行。计数;
if (dt!=空dt .行数。计数0)
{
foreach(dt中的数据行_数据行项目).行)
{
if(_ DataRowItem[' routine _ type ']).ToString().ToUpper()=='FUNCTION ')
{列表。添加(_DataRowItem['routine_name']).ToString());}
}
}
退货清单;
}
public IListstring GetViewInfo()
{
IListstring List=new Liststring();
字符串[] rs=新字符串[] { null,null,null,' BASE TABLE ' };
DataTable dt=GetSchema('视图');
int num=dt .行。计数;
if (dt .行数。计数0)
{
foreach(dt中的数据行_数据行项目).行)
{
列表。添加(_DataRowItem['table_name']).ToString());
}
}
退货清单;
}
#endregion
公共bool SQL bulkcopyimport(IListstring映射列表,字符串数据表名称
{
使用(SqlConnection连接=新的SqlConnection(连接字符串))
{
连接open();
使用(Sqlbulkcopy大容量复制=新Sqlbulkcopy(连接))
{
批量复制DestinationTableName=TableName;
foreach(映射列表中的字符串a)
{
批量复制。列映射。添加(一、一);
}
尝试
{
批量复制. writtetoserver(dt);
返回真;
}
捕获(例外e)
{
扔e;
}
}
}
}
3.2007年加入数据库对该接口的具体实现方法
其中大部分的方法实现基本相似。但ACCEE2007本身不支持存储过程,但支持单个插入、删除、更新等语句,在联合查询(工会)中,往往默认进入了存储过程架构下,所以导致接近在实现分布性接口时,需要进行一些特殊的处理。其中,本工具把删除和更新操作默认为存储过程,对查询和联合查询定义为视图。具体实现的代码如下:
公共bool IF_Proc(字符串sql)
{
if (sql .ToUpper().包含(' DELETE') || sql .ToUpper().包含('更新)
返回真;
else if (sql .ToUpper().包含(' SELECT') sql .ToUpper().包含(“进入”)
返回真;
否则返回错误的
}
public IListstring GetProcInfo()
{
IListstring List=new Liststring();
数据表dt=GetSchema('过程');
int num=dt .行。计数;
if (dt!=空dt .行数。计数0)
{
foreach(dt中的数据行_数据行项目).行)
{
IF(IF _ Proc(_ DataRowItem[' PROCEDURE _ DEFINITION ']).ToString()))
{
列表。添加(_ DataRowItem[' PRocESS _ NAME ']).ToString());
}
}
}
退货清单;
}
public IListString GetFunctionInfo()
{
IListstring List=new Liststring();
数据表dt=GetSchema('过程');
int num=dt .行。计数;
if (dt!=空dt .行数。计数0)
{
foreach(dt中的数据行_数据行项目).行)
{
if(_ DataRowItem[' PRocESS _ TYPE '].ToString().ToUpper()=='FUNCTION ')
{列表。添加(_ DataRowItem[' PRocESS _ NAME ']).ToString());}
}
}
退货清单;
}
public IListstring GetViewInfo()
{
IListstring List=new Liststring();
字符串[] rs=新字符串[] { null,null,null,' BASE TABLE ' };
DataTable dt=GetSchema('视图');
int num=dt .行。计数;
if (dt .行数。计数0)
{
foreach(dt中的数据行_数据行项目).行)
{
列表。添加(_DataRowItem['table_name']).ToString());
}
}
//添加被架构默认为存储过程的视图
dt=GetSchema('过程');
num=dt .行。计数;
if (dt!=空dt .行数。计数0)
{
foreach(dt中的数据行_数据行项目).行)
{
if(!IF _ Proc(_ DataRowItem[' PROCEDURE _ DEFINITION '].ToString()))
{
列表。添加(_ DataRowItem[' PRocESS _ NAME ']).ToString());
}
}
}
退货清单;
}
public int ReturnTbCount(字符串tb_name)
{
使用(oledb连接连接=新的oledb连接(connectionString))
{
尝试
{
字符串SQL='从' tb_name '中选择计数(*);
连接open();
oledb命令cmd=新的oledb命令(SQL,连接);
(同Internationalorganizations)国际组织计数=int .解析(cmd .ExecuteScalar().ToString());
返回计数;
}
捕捉(系统数据。sqlclient。sqlexception(ex)
{
抛出新的异常(例如。消息);
}
}
}
#endregion
//批量插入数据方法的实现
公共bool SQL bulkcopyimport(IListstring映射列表,字符串数据表名称
{
尝试
{
使用(oledb连接连接=新的oledb连接(connectionString))
{
连接open();
OleDbDataAdapter=新的OleDbDataAdapter('从' TableName '中选择*其中1=0 ',连接);
OleDbCommandBuilder构建器=新的OleDbCommandBuilder(适配器);
int rowcount=dt .行。计数;
for(int n=0;行数;n)
{
dt .行[n].setAdded();
}
//适配器UpdateBatchSize=1000
适配器。更新(dt);
}
返回真;
}
捕获(例外e)
{
扔e;
}
}
4.甲骨文数据库对该接口的具体实现方法
神谕数据库查询数据库计划的信息,用的是甲骨文自带的甲骨文。数据访问。客户端库,其中有一些架构信息与微软在。Net2.0中提供的方法不一致。具体的实现,可以参见源码,在此不列出了。