当前位置:编程学习 > C#/ASP.NET >>

再开一帖,百分献上,定要解决 Merge 后没法update

我的需求是从sql的库里面,导出大批的数量,导入到access中 

access中和sql的库的结构是一模一样的,access是个空库,有点像下载数据的功能 

我把sql里面的数据,弄到datatable中,然后用把access通过OleDbDataAdapter填充到datatable中, 

然后我把两个datatable通过 Merge 合并起来,直到这里都是正常的,两个datatable已经正常的合并起来了 

然后我通过下面的代码,来更新到access库中,就总是更新不上了 

ds 是我从sql里面取得带有数据的dataset,myds是我从access取得的只有结构但是没有数据的dataset



        myDa.Fill(myDs, strTableName);

        OleDbCommandBuilder objCommandBuilder = new OleDbCommandBuilder(myDa);   

        myDs.Tables[0].Merge(ds.Tables[0]);

        myDa.InsertCommand = objCommandBuilder.GetInsertCommand();

        myDs.Tables[strTableName].AcceptChanges();

        myDa.Update(myDs.Tables[0]);





不知道哪里不对呢,请指教 
--------------------编程问答-------------------- --------------------编程问答-------------------- 帮你顶下 --------------------编程问答-------------------- --------------------编程问答-------------------- Merge  有个参数是否保持原有的行状态。

如果都是添加你可以手动循环一下。再设置为add --------------------编程问答-------------------- 我就是不想循环插入,一是数据量大,二是为了能批量的导入,专门弄了个同样结构的access库,如果再循环就没有意义了,另外,既然有这种功能,我们为什么不用呢,我就是要搞定这个事情~

--------------------编程问答-------------------- OleDbConnection olecon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Jet OLEDB:Engine Type=5");
olecon.Open();

OleDbDataAdapter oda = new OleDbDataAdapter("select * from TableName" , olecon);
DataSet newds = new DataSet();
try
{
OleDbCommandBuilder cmdbld = new OleDbCommandBuilder(oda);
cmdbld.SetAllValues = true;
oda.InsertCommand = cmdbld.GetInsertCommand();
ds.Tables[i].BeginLoadData();
int rowcount = ds.Tables[i].Rows.Count;
for (int n = 0; n < rowcount; n++)
{
ds.Tables[i].Rows[n].SetAdded();
}
ds.Tables[i].EndLoadData();
oda.UpdateBatchSize = 1000;
}
catch
{

}
oda.Update(ds, ds.Tables[i].TableName);
oda.Dispose();
olecon.Close();
olecon.Dispose()
--------------------编程问答-------------------- 回6楼,DataSet newds = new DataSet();  没用上啊,自己循环自己?是啥意思啊,能否说一下,谢谢 --------------------编程问答-------------------- 帮顶,接分 --------------------编程问答-------------------- 关注一下 前两天也碰到这个问题了 

后来直接用的SQL语句 一条一条插入的 --------------------编程问答-------------------- 好了好了,我整理下告诉大家,用的就是wuyq11的方法,只不过他省略了很多哦  --------------------编程问答-------------------- 帮顶,接分 --------------------编程问答-------------------- 来学习下 --------------------编程问答-------------------- 前面的不多说了,我贴出关键部分的代码,供大家参考,ds是sql中取得的数据,myds是access中取得的空结构表,用来接收数据的。



        OleDbCommand myCmd = new OleDbCommand(strSQL, conn);

        myCmd.CommandType = CommandType.Text;

        OleDbDataAdapter myDa = new OleDbDataAdapter(myCmd);

        DataSet myDs = new DataSet();

        myDa.Fill(myDs, strTableName);

        OleDbCommandBuilder objCommandBuilder = new OleDbCommandBuilder(myDa);

        //try
        {
            objCommandBuilder.SetAllValues = true;

            myDa.InsertCommand = objCommandBuilder.GetInsertCommand();
            
            myDs.Tables[0].Merge(ds.Tables[0]);

            myDs.Tables[0].BeginLoadData();

            int iRows = myDs.Tables[0].Rows.Count-1;

            for (int i = 0; i <= iRows; i++)
            {
                myDs.Tables[0].Rows[i].SetAdded();
            }

            myDs.Tables[0].EndLoadData();

            myDa.Update(myDs.Tables[0]);
  


成功合并之后,循环每一行,设置SetAdded,这个是把每一行的RowState设置为Add的状态,
这样提交的时候,才会给你更新上。

我又查了相关资料,当A和B进行Merge操作后,并不会讲RowState更改为全新的,而是使用A和B之前的状态,之前是什么状态,合并之后还是什么状态,所以这里更新不上。

--------------------编程问答-------------------- 帮顶,接分 --------------------编程问答-------------------- 把这一行去掉:
myDs.Tables[strTableName].AcceptChanges();

AcceptChanges() 会提交你的更改,从而导致行状态无效,所以你更新不上。

--------------------编程问答-------------------- Merge是什么,学习
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,