您的位置:首页 > 数据库

c# 程序实现ACCESS数据导入SQL的方法

2007-12-20 00:51 996 查看
方法一:用sql语句
/*************导出到Access********************/
insert into openrowset(’Microsoft.Jet.OLEDB.4.0’,
’x:/A.mdb’;’admin’;’’,A表) select * from 数据库名..B表

/*************导入Access********************/
insert into B表 selet * from openrowset(’Microsoft.Jet.OLEDB.4.0’,
’x:/A.mdb’;’admin’;’’,A表)

方法二:按记录逐条处理

操作ACCESS数据库和操作SQL SERVER 差不多,只是C#里面连接ACCESS要用
System.Data.OleDb类,因为ACCESS不支持两个表的批处理(2000之前的版本不支持,2000之后的就不知道了。),所以你要判断插入和更新,建议按记录逐条处理。
我的思路是这样:先从ACCESS数据库查询出该需要操作的数据,生成DataTable临时表,然后循环DataTable表,将数据更新到SQL SERVER数据库,无的插入,有的更新。
示例如下:
//命名空间
using System;
using System.Data;
using System.Data.OleDb;
//连接ACCESS数据库代码
OleDbConnection adoConn= new OleDbConnection();
string StrConn= "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=密码;Data source=d:/accessTest.mdb";
adoConn.ConnectionString =StrConn;
adoConn.Open();
//从ACCESS数据库查询数据
string sql1="select * from table1";
OleDbDataAdapter dataAdapter = new OleDbDataAdapter (sql1, adoConn);
DataTable dTable=new DataTable();
dataAdapter.Fill (dTable);
dataAdapter.Dispose();
adoConn.close();
//连接SQL SERVER
StrConn= "略(连接SQL SERVER 数据库的字符串)";
adoConn.ConnectionString =StrConn;
adoConn.Open();
OleDbCommand cmd=adoConn.CreateCommand();
OleDbTransaction Trans=adoConn.BeginTransaction();
cmd.Transaction=Trans;
Trans.Rollback();
try
{
//处理table表数据,导入到SQL SERVER 数据库
for(int i=0;i<dTable.Rows.Count;i++)
{
DataRow dRow=dTable.Rows[i];
//处理记录,插入到SQL SERVER数据库
//…………
//sql1="insert into …… values("+DataRow[]……+")";
//sql1="update …… where id="+DataRow[id];
cmd.CommandText=sql1;
cmd.ExecuteNonQuery();
}
Trans.Commit();//成功结束事务
}
catch
{
Trans.Rollback();
}
cmd.Dispose();
dTable.Dispose();
adoConn.close();
另外也可以在SQL SERVER里面建立一个存储过程来处理,存储过程做的事情如下:
1。把ACCESS表里的数据导入到SQL数据库的一个临时表(建议看一下帮助SQL里怎样操作ACCESS)
2。对临时表进行处理,将数据导入到目的表(这样就可以批处理更新了。)
可以考虑将存储过程放到作业里面来定时调用处理ACCESS文件
注意事项:

数据库导入以后,自动增加字段需要重写,所有的数字类型需要增加长度,最好用decimal。

所有的默认值都丢失了。主要是数字类型和日期类型。

所有now(),time(),date()要改成getdate()。

所有datediff(‘d‘, time1, time2)要改成datediff(day, time1, time2)

有可能一些true/false类型不能使用,要变为1/0。

备注类型要通过cast(column as varchar)来使用。

CursorType要改成1,也就是打开数据库时要给出第一个数字参数为1,否则记录可能显示不完整。

isnull(rowname)要改成rowname = null

ACCESS的数据库中的自动编号类型在转化时,sql server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号!

转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。有时用smalldatetime型时,转化失败,而用datetime型时,转化成功。

对此两种数据库进行操作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:“delete * from user where id=10“,而对SQL SERVER数据库进行删除是用:“delete user where id=10“.

日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。

在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL SERVER数据库处理中,却不能用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐