ADO.NETCommandBuilder、InsertCommand和DefaultConstraints我正在从表A复制数据到表B,表B有一个可为空的列,其默认约束值为0.通常,我使用以下访问器来设置列的值。publicobjectthis[stringcolumnName]{get{returnDataTable.Rows[CurrentRow][columnName];}set{DataTable.Rows[CurrentRow][columnName]=value;}}但我没有设置我的可空列X.insert设置整行时,不使用默认值。为可为空的列插入NULL而不是0。_sqlCommandBuilder=newSqlCommandBuilder(_sqlDataAdapter);_sqlCommandBuilder.ConflictOption=ConflictOption.OverwriteChanges;_sqlCommandBuilder.SetAllValues=false;_sqlDataAdapter.Update(DataTable);我还得到了架构:_sqlDataAdapter.Fill(DataTable);_sqlDataAdapter.FillSchema(表映射);为什么ADO.NET将我的列X设置为NULL,即使我没有设置它?我认为当我没有为X列设置值时,ADO.NET会从给定的约束中获取默认值。ADO.NETCommandBuilder是否能够使用默认约束?您不需要使用CommandBuilder来实现DataAdapter的更新方法。CommandBuilder充满了问题。您可以设置DataAdapter.SelectCommand和DataAdapter.UpdateCommand属性来直接指定sql的DbCommand对象。这避免了CommandBuilder生成正确的sql语句所固有的问题。更新:CommandBuilder无法知道您要使用默认值。它所做的只是生成一个插入语句,如果有列,它会为插入语句生成它。如果该列是插入语句的一部分,则将插入为该列指定的任何值,即使是空值。如果您不将其包含在插入语句中,则应用默认值。无论您如何尝试插入项目,CommandBuilder都不会将null转换为默认值。继续尝试使用CommandBuilder只会让您更加痛苦。它甚至无法处理select子句中的简单连接语句。它还需要一个主键。如果违反其中任何一条,则无法生成正确的更新、插入和删除语句。只有SqlServer和Oracle两个供应商实现了这个类,并且已知Oracle有一些在上述基本问题之外从未修复的错误。如果您使用两个DbCommand对象,一个用于选择,一个用于插入,然后循环通过DbDataReader以选择DbCommand的输出,您可以轻松检查该列中的空值并为插入DbCommand提供默认值零,因为你知道它是什么。了解数据库的规则并在必要时使用它们不会违反任何类型的代码组织规则。无论如何,您必须知道数据库中有什么才能编写此类代码。如果你有sqlserver2005或更高版本,另一个建议是使用INSERTINTO..SELECT语句。如果你的sql足够好,你可以使用CASE子句来生成单个sql语句。一个看似显而易见的小问题,实际上却很棘手。_sqlCommandBuilder.ConflictOption=ConflictOption.OverwriteChanges;如果我引用MSDN定义,您可以阅读:“如果没有定义PrimaryKey,则所有可搜索的列都包含在WHERE子句中。”我的一个朋友在一些camses(1,1)中定义了IDENTITY而不是主键。这么小的问题是,您是否在“更新”表B中使用主键?然后....添加信息,SqlAdapter.FillSchema不使用默认值这里是FillSchema检索到的信息:AllowDBNullAutoIncrement。您必须分别设置AutoIncrementStep和AutoIncrementSeed。MaxLengthReadOnlyUnique(引自MSDN站点).NETCommandBuilder、InsertCommand和DefaultConstraints分享的全部内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理会员删除。如需转载请注明出处:
