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

方法一:用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数据库处理中,却不能用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值