li.的博客
li.的首页 > li.的博客 > 浏览文章

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

分类:.net应用  人气:1439  评论:0  时间:2012-06-24 01:12

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

评论(0)
暂无评论
我来评论
(800字以内)