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