再开一帖,百分献上,定要解决 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#