使用C#和DataSet更新远程Oracle数据库的问题
问题
我有一个远程Oracle数据库及目标数据表,在C#程序中通过VS DataSet设计器创建了DataSet,并为该表添加了TableAdapter。现在需要向该数据库表添加新行,但尝试了两种方法都没能成功更新:
- 在DataSet适配器中添加插入行查询,调用代码如下:
DataSetTableAdapters.INVENTURTableAdapter inventur_adapter = new INVENTURTableAdapter(); inventur_adapter.InsertQuery( arg1, arg2, arg3, ...);
无报错但未更新远程数据库。
- 尝试微软文档中的方法:
DataSet ds = new DataSet(); DataSet.INVENTURRow newInventurRow = ds.INVENTUR.NewINVENTURRow(); newInventurRow.SOMEARG = value; ... ds.NIESSING.Rows.Add(newInventurRow);
同样无报错但未更新数据库。
参考微软文档中的保存代码this.regionTableAdapter.Update(this.northwindDataSet.Region);,尝试适配时遇到问题:
- 尝试
DataSetTableAdapters.INVENTURTableAdapter.Update(DataSet.INVENTUR);,无法使用DataSet.INVENTUR,只能用INVENTURDataTable但无效; - 尝试
DataSetTableAdapters.INVENTURTableAdapter.Update(ds.INVENTUR);,抛出错误:
An object reference is required for non-static
请问如何才能真正保存更新后的数据?
解决方法
方法一:修复直接调用InsertQuery的问题
如果你的InsertQuery是手动添加的,先确认两个核心点:
- SQL语句正确性:检查
InsertQuery的Oracle语法是否合规,是否包含所有必填字段,主键(如序列生成)是否正确调用。 - 连接与权限:确认TableAdapter的连接字符串能正常访问远程Oracle,且数据库账号有插入数据的权限。
调用时直接实例化适配器执行即可,无需额外合并操作:
using (var inventurAdapter = new DataSetTableAdapters.INVENTURTableAdapter()) { // 确保参数类型、值符合数据库字段约束 inventurAdapter.InsertQuery(arg1, arg2, arg3, ...); }
方法二:正确使用DataSet+TableAdapter的新增流程
你之前的代码漏掉了提交更改到数据库的关键步骤,完整流程如下:
- 实例化DataSet和TableAdapter,可选加载现有数据以保证结构匹配
- 创建新行并赋值,添加到DataSet的对应表中
- 调用TableAdapter的
Update方法提交更改
完整代码示例:
// 1. 实例化DataSet和TableAdapter var ds = new DataSet(); var inventurAdapter = new DataSetTableAdapters.INVENTURTableAdapter(); // 可选:加载现有数据到DataSet,确保表结构与数据库一致 inventurAdapter.Fill(ds.INVENTUR); // 2. 创建新行并赋值 DataSet.INVENTURRow newRow = ds.INVENTUR.NewINVENTURRow(); newRow.SOMEARG = value; // 为其他必填字段赋值 newRow.ANOTHER_FIELD = anotherValue; // 将新行添加到DataSet的表中 ds.INVENTUR.Rows.Add(newRow); // 3. 提交更改到数据库 inventurAdapter.Update(ds.INVENTUR);
解决"An object reference is required for non-static"错误
这个错误是因为你直接调用了INVENTURTableAdapter类的静态Update方法,但Update是实例方法,必须先实例化INVENTURTableAdapter对象,再调用其Update方法,就像上面代码中的inventurAdapter.Update(ds.INVENTUR);。
额外排查点
- 检查事务:如果代码在事务块中但未提交,会导致数据不写入数据库。
- 验证TableAdapter命令:在VS DataSet设计器中右键
INVENTURTableAdapter选择"配置",确认自动生成了正确的Insert/Update/Delete命令。 - 调试SQL:可以输出TableAdapter执行的SQL语句,排查是否正确发送到数据库。
内容的提问来源于stack exchange,提问作者Rev1k
相关产品推荐
相关产品推荐

