2011-05-03 75 views
4

我“AM复制从表A中的数据表B 表B具有可空列具有0 一般我设定值的默认约束值使用以下访问器的列。ADO.NET CommandBuilder的,将InsertCommand和默认约束

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

但我不设置可空列X.

当我插入整个行,不使用默认值。而不是0,为空的列插入NULL。

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

我也得到了架构:

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

为什么ADO.NET设置为NULL我的专栏X虽然我没有设置呢?

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

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

回答

3

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

更新:

没有办法对CommandBuilder的知道你要使用的默认值。它所做的就是生成一个插入语句,如果有一列要为插入语句生成它。如果该列是插入语句的一部分,那么将为该列提供的任何值(即使为null)都将被插入。缺省值适用于不包含在插入语句中的情况。它不会将null转换为默认值,无论您如何尝试插入项目,CommandBuilder或不。

继续沿着这条尝试使用CommandBuilder的道路只会给你更多的伤痛。它甚至无法在其select子句中处理简单的连接语句。它还需要一个主键。如果其中任何一个被违反,则它不能生成正确的更新,插入和删除语句。只有两个提供程序Sql Server和Oracle曾经实现过这个类,Oracle已知有一些在上述基本问题之外从未修复过的错误。

如果您使用了两个DbCommand对象,一个用于选择和一个用于插入,然后通过DbDataReader循环选择DbCommand的输出,您可以轻松地检查该列中的空值,并将默认值为零插入DbCommand,因为你知道它是什么。了解数据库规则并在必要时使用它们并不违反任何类型的代码组织规则。为了编写这种代码,你必须知道数据库中的内容。

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

+0

我不想手动创建更新,创建,删除语句。我希望我能正确理解你。如果没有,请让我知道:) – Rookian 2011-05-12 10:44:48

+0

您可能会认为,当您向表中添加一行时,只有您设置的列将位于插入语句中,从而允许默认值正确显示。这在ADODB中有效,我很惊讶ADO.NET已经失去了这个功能。 – Brain2000 2014-03-17 18:41:51

0

一个小问题,它可能看起来很明显,但实际上它很棘手。

_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges; 

如果我引用MSDN definition你可以阅读:

"If no PrimaryKey is defined, all searchable columns are included in the WHERE clause." 

我的一个朋友,使用(1,1)在一些camses,而不是主键定义IDENTITY。

这么小的问题是,你在你的“更新”表B中使用主键吗?



然后....

添加信息,SqlAdapter.FillSchema不使用默认值 这里是由FillSchema的检索信息:

AllowDBNull 
AutoIncrement.You must set AutoIncrementStep and AutoIncrementSeed separately. 
MaxLength 
ReadOnly 
Unique 

(引自MSDN site

独特

+0

主键被定义,但你的第二个信息是信息性的,谢谢:)但它没有解决我的问题。 – Rookian 2011-05-12 10:56:19