我正在将数据从表 A 复制到表 B。
表 B 有一个nullable列有一个默认约束值为 0。
一般来说,我使用以下访问器设置列的值。
public object this[string columnName]
{
get { return DataTable.Rows[CurrentRow][columnName]; }
set { DataTable.Rows[CurrentRow][columnName] = value; }
}
但是我愿意NOT set my nullableX 栏。
当我插入整行时,不使用默认值。对于可为空的列,插入了 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
. The CommandBuilder
充满了问题。您可以设置DataAdapter.SelectCommand
和DataAdapter.UpdateCommand
属性到DbCommand
直接指定sql的对象。这避免了固有的问题CommandBuilder
能够生成正确的 sql 语句。
Update:
CommandBuilder 无法知道您想要使用默认值。它所做的只是生成一个插入语句,如果有一个列,它将为插入语句生成它。如果该列是插入语句的一部分,则将为该列指定的任何值(甚至 null)都将被插入。默认值适用于不将其包含在插入语句中的情况。无论您如何尝试插入项目(无论是否使用 CommandBuilder),它都不会将 null 转换为默认值。
继续尝试使用 CommandBuilder 只会给您带来更多痛苦。它甚至无法处理其 select 子句中的简单连接语句。它还需要一个主键。如果违反其中任何一个,则它无法生成正确的更新、插入和删除语句。只有两个提供商,Sql Server 和 Oracle,曾经实现过此类,并且众所周知,Oracle 存在除了上述基本问题之外从未修复过的错误。
如果您使用两个 DbCommand 对象,一个用于选择,一个用于插入,然后通过 DbDataReader 循环遍历 select DbCommand 的输出,您可以轻松检查该列中的 null 并向 insert DbCommand 提供默认值零,因为你知道它是什么。了解数据库的规则并在必要时使用它们并不违反任何类型的代码组织规则。无论如何,您必须知道数据库中有什么才能编写此类代码。
如果您有 sql server 2005 或更高版本,另一个建议是使用插入..选择 http://msdn.microsoft.com/en-us/library/ms188263%28v=SQL.90%29.aspx陈述。如果你的sql足够好你可以使用CASE http://msdn.microsoft.com/en-us/library/ms181765.aspx子句来生成单个 sql 语句。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)