【发布时间】:2017-06-25 22:00:24
【问题描述】:
我有一个包含强类型数据集行的属性。 我已向我的数据集添加了插入和更新过程。 如果我向适配器传递一个已经存在的行,它会成功更新信息。但是,如果我创建一个新行,那么它不会将其插入到数据库表中。永远不会抛出异常,返回的 int 始终为 0。没有添加新行。
private MyDataset.MyDatasetGetDataRow _row;
private MyDataset.MyDatasetGetDataRow Rowa
{
get { return _row; }
set { _row = value; }
}
public void NewOne()
{
MyDatasetTableAdapters.MyDatasetGetDataTableAdapter adapter = new MyDatasetTableAdapters.MyDatasetGetDataTableAdapter();
MyDataset.MyDatasetGetDataDataTable tbl = adapter.GetData(0, 0);
MyDataset.MyDatasetGetDataRow row = tbl.NewMyDatasetGetDataRow();
Rowa = row;
}
public int Save()
{
try
{
int a = -99;
using (MyDatasetTableAdapters.MyDatasetGetDataTableAdapter adapter = new MyDatasetTableAdapters.MyDatasetGetDataTableAdapter())
{
a = adapter.Update(tbl);
}
return a;
}
catch (Exception ex)
{
throw new Exception("Error: It didn't save. (" + ex.Message + ")");
}
}
【问题讨论】:
-
新的不行。要使适配器工作,它需要一个文本 SQL 语句。您的代码没有 SQL,因此 Rowa/row 将始终为空。因此读取不起作用,因此很难判断您是否写入了数据。
-
适配器通过与数据库的连接和存储过程附加了一个选择、更新和插入 SQL 语句。正如我所提到的,对现有行的更新有效,但是不会插入新行。 Rowa有数据存在,不为null,更新不报错,只是简单的返回0。
-
什么???连接不会创建 SQL 语句,除非您在 C# 代码中以您未发布的不同方法执行此操作。
-
这就是适配器的重点。适配器包含连接,它指向数据库中的 3 个存储过程。获取、更新和插入。获取和更新工作。插入没有。但它返回 0。你是说可能的原因是我的插入过程错误吗?
-
谁告诉你的?适配器要求您添加文本命令。如果适配器中有一个 Select 命令,commandbuilder 将自动从选择中创建插入、删除和更新。但是适配器很笨,只做你编程的事情。
标签: c# ado.net dataset strongly-typed-dataset