[困惑了一整天的问题]关于OleDbDataAdapter.UpDate()的奇怪现象,请教各位!

维她奶 2004-11-05 05:25:29
项目开发中需要实现从Oracle数据库读取数据,然后保存到本地的Access中。

我使用的方法是:

(Step 1)
DataSet tmpDs = new DataSet();
//OracleDb是一个数据接口,SQLSelect()执行Sql语句并返回一个Dataset;
tmpDs = OracleDB.SQLSelect("select * from userInfo");
//执行了上面的语句之后,已经从Oracle获取了数据;


string cnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " + "c:\\data.mdb";
OleDbConnection cn = new OleDbConnection(cnStr);
OleDbDataAdapter da = new OleDbDataAdapter("select * from userInfo",cn);
//data.mdb中的表userInfo结构和Oracle中的表userInfo完全相同;
OleDbCommandBuilder cmb = new OleDbCommandBuilder(da);

da.Update(tmpDs,tmpDs.Tables[0].TableName);

(Step 2)
//执行完Update()操作之后,没有任何异常产生,但也没有把tmpDs中的数据Update进去
//但是如果用以下方法手工产生一个结构和表userInfo相同的DataSet,却可以把数据更新进去:

DataColumn tmpCol;
DataRow tmpRow;
DataTable tmpDt = new DataTable("uInfo");
DataSet tmpDs2 = new DataSet();

tmpCol = new DataColumn("id",Type.GetType("System.Int32"));
tmpDt.Columns.Add(tmpCol);

tmpCol = new DataColumn("userName",Type.GetType("System.String"));
tmpDt.Columns.Add(tmpCol);

tmpCol = new DataColumn("userAge",Type.GetType("System.Decimal"));
tmpDt.Columns.Add(tmpCol);

tmpCol = new DataColumn("userDefine",Type.GetType("System.Decimal"));
tmpDt.Columns.Add(tmpCol);

tmpCol = new DataColumn("userAddr",Type.GetType("System.String"));
tmpDt.Columns.Add(tmpCol);

tmpCol = new DataColumn("RegDate",Type.GetType("System.DateTime"));
tmpDt.Columns.Add(tmpCol);

tmpRow = tmpDt.NewRow();
tmpRow["id"] = "20";
tmpRow["userName"] = "Young";
tmpRow["userAge"] = "21";
tmpRow["userDefine"] = "222.000";
tmpRow["userAddr"] = "aaaaaaaaa";
tmpRow["RegDate"] = "2002-11-11";

tmpDt.Rows.Add(tmpRow);
tmpDs2.Tables.Add(tmpDt);
da.Update(tmpDs2,tmpDs2.Tables[0].TableName);

(Step 3)
//这样就可以把tmpDs2的数据更新进mdb中
//之后就我发现了迷惑了我一下午的问题:
tmpDs = OracleDB.SQLSelect("select * from userDetail");
da.Update(tmpDs,tmpDs.Tables[0].TableName);
//注意,这里是从表userDetail读取数据,然后在更新mdb中的表userInfo(两个表的结构是完全不同的),但这个时候却没有异常产生,但也没把数据更新进去,而如果在用手工生成一个结构和userDetail的DataSet(如Step 2中一样)就会出现异常,这是为什么?

望各位高手解答呀!!!
...全文
314 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
swzlxm 2004-11-05
  • 打赏
  • 举报
回复
如果你不用这句,得不到最后结果

dataset.acceptchanges()
swzlxm 2004-11-05
  • 打赏
  • 举报
回复


me.contextbinding(dataset,"table").Endccurrentedit()
dataset.acceptchanges()
spldp.update(dataset)
layershow 2004-11-05
  • 打赏
  • 举报
回复
嗯,RowState是 只读的 :)
DataAdapter有个属性AcceptChangesDuringFill
就是说在Fill是否接受改变,默认是true
这样Fill的时候, DataRow状态都是Unchanged
只要把它设置成false就行了
Fill之后DataRow的状态都是Added :)
维她奶 2004-11-05
  • 打赏
  • 举报
回复
layershow(绿叶兄) 说得很详细,终于明白是什么回事了,谢谢~ :)

那么如果我要把从Oracle读出来的数据都Update到mdb中,是不是要把每一行数据的RowState设成“Added”呢?有没有批量修改的?呵呵...因为用一个循环太费劲了,谢谢~!
layershow 2004-11-05
  • 打赏
  • 举报
回复
啊,这么多,看了半天,终于看明白了

不要困惑,是这样的:
行DataRow有个属性RowState , 这是用来记录这一行的状态
Adapter去Update的时候会先检查行的状态
<可能是Added, Deleted, Modified, Unchanged ...>
Added就应该Insert
Deleted 就应该Delete
Modified 才应该Update
Unchanged就是什么都没改变,不做任何动作

数据从数据库Select到DataSet,状态都是Unchanged <因为没有改变它们>
这时候Update是不会做任何动作的
<所以不出错,哪怕是结构不一样也不出错,因为一检查是Unchanged就跳过去了>

所以, 你添加的数据
tmpRow = tmpDt.NewRow(); // <----行状态变成Added
tmpRow["id"] = "20";
tmpRow["userName"] = "Young";
tmpRow["userAge"] = "21";
tmpRow["userDefine"] = "222.000";
tmpRow["userAddr"] = "aaaaaaaaa";
tmpRow["RegDate"] = "2002-11-11";

是可以送到数据库的 因为tmpRow 的行状态是"新添加"的 Added
Adapter对它Update时 就调用了Insert 语句

minrange 2004-11-05
  • 打赏
  • 举报
回复
1. select from Oracle into dataset1
2. delete .MDB
3. select from .MDB into dataset2
4. insert dataset1 into dataset2
5. dataset2 update
深山老翁 2004-11-05
  • 打赏
  • 举报
回复
帮顶:)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧