dataset更新数据的问题
2010-06-17 10:41
211 查看
OracleConnection conn = new OracleConnection("data source=FFPD;user=wanli;password=wanli123;");
OracleDataAdapter adapter = new OracleDataAdapter("select * from test where pkey = 7 ",conn);
DataSet dataSet = new DataSet();
//下面这句加上就没有问题,否则出错
OracleCommandBuilder mybuilder = new OracleCommandBuilder(adapter);
adapter.Fill(dataSet, "test");
dataSet.Tables[0].Rows[0]["N"] = 12345;
adapter.Update(dataSet,"test");
adapter.Dispose();
问题原因及解决:
====================================================
1.SelectCommand使用的select命令中必须包含主键(primary key)!
2.填充数据集时,使用如下方法:
da.FillSchema(ds,SchemaType.Source, "TableName"); //加载表架构 注意
da.Fill(dsPubs,"TableName"); //加载表数据
3. DataAdapter 的 MissingSchemaAction 属性设置为 AddWithKey
4.构造CommandBuilder对象时,将DataAdapter对象作为构造函数参数传入:
SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(da);
5.增加行,修改行,删除行;
6.调用DataAdapter的update方法更新数据源!
7.更新数据源成功,调用ds的Acceptchanges()方法,更新数据集!
DbDataAdapter调用 Update 方法时,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使用 InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。在调用 Update 之前,必须显式设置这些命令。如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。
但是如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。为了自动生成命令,必须设置 SelectCommand 属性,这是最低的要求。SelectCommand 所检索的表架构确定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。如果在自动生成插入、更新或删除命令后修改 SelectCommand 的 CommandText,则可能会发生异常。如果已修改的 SelectCommand.CommandText 所包含的架构信息与自动生成插入、更新或删除命令时所使用的 SelectCommand.CommandText 不一致,则以后对 DataAdapter.Update 方法的调用可能会试图访问 SelectCommand 引用的当前表中已不存在的列,并且会引发异常。可以通过调用 CommandBuilder 的 RefreshSchema 方法来刷新 CommandBuilder 用来自动生成命令的架构信息。
对于DbDataAdapter.Update 方法更新数据库,每次在调用DbDataAdapter.Update(ds) 之后一定要ds.acceptchanges,否则会对后面用到的ds出现意想不到的错误。
OracleDataAdapter adapter = new OracleDataAdapter("select * from test where pkey = 7 ",conn);
DataSet dataSet = new DataSet();
//下面这句加上就没有问题,否则出错
OracleCommandBuilder mybuilder = new OracleCommandBuilder(adapter);
adapter.Fill(dataSet, "test");
dataSet.Tables[0].Rows[0]["N"] = 12345;
adapter.Update(dataSet,"test");
adapter.Dispose();
问题原因及解决:
====================================================
1.SelectCommand使用的select命令中必须包含主键(primary key)!
2.填充数据集时,使用如下方法:
da.FillSchema(ds,SchemaType.Source, "TableName"); //加载表架构 注意
da.Fill(dsPubs,"TableName"); //加载表数据
3. DataAdapter 的 MissingSchemaAction 属性设置为 AddWithKey
4.构造CommandBuilder对象时,将DataAdapter对象作为构造函数参数传入:
SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(da);
5.增加行,修改行,删除行;
6.调用DataAdapter的update方法更新数据源!
7.更新数据源成功,调用ds的Acceptchanges()方法,更新数据集!
DbDataAdapter调用 Update 方法时,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使用 InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。在调用 Update 之前,必须显式设置这些命令。如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。
但是如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。为了自动生成命令,必须设置 SelectCommand 属性,这是最低的要求。SelectCommand 所检索的表架构确定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。如果在自动生成插入、更新或删除命令后修改 SelectCommand 的 CommandText,则可能会发生异常。如果已修改的 SelectCommand.CommandText 所包含的架构信息与自动生成插入、更新或删除命令时所使用的 SelectCommand.CommandText 不一致,则以后对 DataAdapter.Update 方法的调用可能会试图访问 SelectCommand 引用的当前表中已不存在的列,并且会引发异常。可以通过调用 CommandBuilder 的 RefreshSchema 方法来刷新 CommandBuilder 用来自动生成命令的架构信息。
对于DbDataAdapter.Update 方法更新数据库,每次在调用DbDataAdapter.Update(ds) 之后一定要ds.acceptchanges,否则会对后面用到的ds出现意想不到的错误。
相关文章推荐
- 通过强类型DataSet更新数据的问题。
- 使用连接服务器更新数据效率慢的问题
- Android-ViewPager+Fragment数据更新问题
- linq更新部分数据时遇到的问题及解决办法
- RecyclerView的数据更新问题
- AngularJS进阶(三十四)Angular数据更新不及时问题探讨
- oracle数据库数据量较大时更新数据较慢问题
- Excel读入dataset数据丢失问题
- WPF线程中被修改后DataGrid数据不能及时更新的问题
- 创建和刷新 DataSet 并依次更新原始数据的步骤
- 使用 DataAdapter 和 DataSet 更新数据库
- 在使用ThinkPHP时候数据更新的时候,save()方法返回值为0的问题!!!!
- ClientDataSet加上TDataSetProvider的数据保存问题
- Linq to Sql 更新数据时容易忽略的问题
- 用 DataSet 对象更新数据
- 批量更新数据问题
- 解决HTTP数据不更新问题——no-cache在HTTP通信协议中的应用
- 解决HTTP数据不更新问题——no-cache在HTTP通信协议中的应用收藏
- 如何解决热点数据更新问题
- ajax异步问题导致的刷新页面数据不更新