c# – ADO.NET CommandBuilder,InsertCommand和Default Constraints
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – ADO.NET CommandBuilder,InsertCommand和Default Constraints,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2006字,纯文字阅读大概需要3分钟。
内容图文
![c# – ADO.NET CommandBuilder,InsertCommand和Default Constraints](/upload/InfoBanner/zyjiaocheng/783/67b9916483684d0a80013ef7627de738.jpg)
我正在将数据从表A复制到表B.
表B具有可为空的列,其默认约束值为0.
通常,我使用以下访问器设置列的值.
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);
为什么我的列X的ADO.NET设置为NULL虽然我没有设置它?
我认为当我没有设置列X的值时,ADO.NET从给定的约束中获取默认值.
ADO.NET CommandBuilder是否能够使用默认约束?
解决方法:
您不需要使用CommandBuilder来实现DataAdapter的更新方法. CommandBuilder充满了问题.您可以将DataAdapter.SelectCommand和DataAdapter.UpdateCommand属性设置为直接指定sql的DbCommand对象.这避免了CommandBuilder生成正确的sql语句所固有的问题.
更新:
CommandBuilder无法知道您要使用默认值.它只是生成一个insert语句,如果有一个列,它将为insert语句生成它.如果该列是insert语句的一部分,那么将插入为该列指定的任何值,即使为null.默认值适用于未在insert语句中包含它的情况.无论您如何尝试插入项,CommandBuilder都不会将null转换为默认值.
继续沿着这条尝试使用CommandBuilder的道路只会让你更加悲痛.它甚至无法在select子句中处理简单的连接语句.它还需要一个主键.如果违反其中任何一个,则无法生成正确的更新,插入和删除语句.只有两个提供程序,Sql Server和Oracle,已经实现了这个类,并且已知Oracle有一个从未在上述基本问题之外修复的错误.
如果您使用了两个DbCommand对象,一个用于选择,一个用于插入,然后通过DbDataReader循环选择DbCommand的输出,您可以轻松地检查该列中的null并为插入DbCommand提供默认值零,因为你知道它是什么.了解数据库的规则并在必要时使用它们并不违反任何类型的代码组织规则.无论如何,你必须知道数据库中的内容才能编写这种代码.
如果您有sql server 2005或更高版本,另一个建议是使用INSERT INTO .. SELECT语句.如果您的sql足够好,您可以使用CASE子句来生成单个sql语句.
内容总结
以上是互联网集市为您收集整理的c# – ADO.NET CommandBuilder,InsertCommand和Default Constraints全部内容,希望文章能够帮你解决c# – ADO.NET CommandBuilder,InsertCommand和Default Constraints所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。