gpt4 book ai didi

c# - ADO.NET CommandBuilder、InsertCommand 和默认约束

转载 作者:行者123 更新时间:2023-11-30 12:16:13 38 4
gpt4 key购买 nike

我正在将数据从表 A 复制到表 B。表 B 有一个可空列,该列的默认约束值为 0。通常,我使用以下访问器设置列的值。

public object this[string columnName]
{
get { return DataTable.Rows[CurrentRow][columnName]; }
set { DataTable.Rows[CurrentRow][columnName] = value; }
}

但我没有设置我的nullable列X。

当我插入整行时,没有使用默认值。为可为空的列插入了 NULL,而不是 0。

_sqlCommandBuilder = new SqlCommandBuilder(_sqlDataAdapter);
_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges;
_sqlCommandBuilder.SetAllValues = false;
_sqlDataAdapter.Update(DataTable);

我也得到了架构:

_sqlDataAdapter.Fill(DataTable);
_sqlDataAdapter.FillSchema(_dataTable, SchemaType.Mapped);

为什么 ADO.NET 为我的列 X 设置了 NULL,尽管我没有设置它?

我认为当我不设置 X 列的值时,ADO.NET 会从给定的约束中获取默认值。

ADO.NET CommandBuilder 是否能够使用默认约束?

最佳答案

您不需要使用 CommandBuilder 来为您的 DataAdapter 实现更新方法。 CommandBuilder 充满了问题。您可以将 DataAdapter.SelectCommandDataAdapter.UpdateCommand 属性设置为直接指定 sql 的 DbCommand 对象。这避免了 CommandBuilder 生成正确 sql 语句的能力所固有的问题。

更新:

CommandBuilder 无法知道您要使用默认值。它所做的只是生成一个插入语句,如果有一个列,它将为插入语句生成它。如果该列是插入语句的一部分,则将插入为该列指定的任何值,即使是空值。默认值适用于您不将其包含在插入语句中的情况。它不会将 null 转换为默认值,无论您尝试如何插入项,无论是否使用 CommandBuilder。

继续尝试使用 CommandBuilder 只会给您带来更多的痛苦。它甚至无法在其 select 子句中处理简单的连接语句。它还需要一个主键。如果违反其中任何一个,则它无法生成正确的更新、插入和删除语句。只有 Sql Server 和 Oracle 两个供应商实现了这个类,而 Oracle 供应商已知存在除上述基本问题之外的错误,这些错误从未得到修复。

如果您使用两个 DbCommand 对象,一个用于选择,一个用于插入,然后通过 DbDataReader 循环选择 DbCommand 的输出,您可以很容易地检查该列中的空值并为插入 DbCommand,因为您知道它是什么。了解数据库的规则并在必要时使用它们并不违反任何一种代码组织规则。无论如何,您必须知道数据库中有什么才能编写此类代码。

如果您有 sql server 2005 或更高版本,另一个建议是使用 INSERT INTO .. SELECT陈述。如果你的 sql 足够好,你可以使用 CASE子句来创建单个 sql 语句。

关于c# - ADO.NET CommandBuilder、InsertCommand 和默认约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5868313/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com