You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#和DataSet更新远程Oracle数据库的问题

问题

我有一个远程Oracle数据库及目标数据表,在C#程序中通过VS DataSet设计器创建了DataSet,并为该表添加了TableAdapter。现在需要向该数据库表添加新行,但尝试了两种方法都没能成功更新:

  1. 在DataSet适配器中添加插入行查询,调用代码如下:
DataSetTableAdapters.INVENTURTableAdapter inventur_adapter = new INVENTURTableAdapter();

inventur_adapter.InsertQuery( arg1, arg2, arg3, ...);

无报错但未更新远程数据库。

  1. 尝试微软文档中的方法:
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是手动添加的,先确认两个核心点:

  1. SQL语句正确性:检查InsertQuery的Oracle语法是否合规,是否包含所有必填字段,主键(如序列生成)是否正确调用。
  2. 连接与权限:确认TableAdapter的连接字符串能正常访问远程Oracle,且数据库账号有插入数据的权限。

调用时直接实例化适配器执行即可,无需额外合并操作:

using (var inventurAdapter = new DataSetTableAdapters.INVENTURTableAdapter())
{
    // 确保参数类型、值符合数据库字段约束
    inventurAdapter.InsertQuery(arg1, arg2, arg3, ...);
}

方法二:正确使用DataSet+TableAdapter的新增流程

你之前的代码漏掉了提交更改到数据库的关键步骤,完整流程如下:

  1. 实例化DataSet和TableAdapter,可选加载现有数据以保证结构匹配
  2. 创建新行并赋值,添加到DataSet的对应表中
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:53:14