【问题标题】:Use DataTable.Load() without creating all column properties使用 DataTable.Load() 而不创建所有列属性
【发布时间】:2015-06-29 22:39:12
【问题描述】:

我正在从 SQL Server 数据库中加载数据,如下所示:

SqlCommand cmd = new SqlCommand("select * from x", conn);
cmd.CommandType = CommandType.Text;
DataTable dt = new DataTable();
SqlDataReader rd = cmd.ExecuteReader();
dt.Load(rd, LoadOption.PreserveChanges); 

问题:

Load() 函数使用ColumnNameDataType 初始化表列,但它也更深入地查看数据库,并添加了一些约束,如AllowDBNullAutoIncrementMaxLength 等。

但是,这会导致我的应用程序出现问题,因为我想在内部进一步处理数据。

那么,是否可以只设置最基本的属性(直接来自select 语句)而不设置AllowDBNullMaxLength 等来执行Load()?还是我需要在 Load() 之后清除这些值?或者有没有其他方法可以打电话给Load()

【问题讨论】:

标签: c# .net sql-server


【解决方案1】:

如果您不希望这种行为不要使用DataTable.Load,而是使用DbDataAdapter.Fill(DataTable)

DataTable dt = new DataTable();
using(var da = new SqlDataAdapter("select * from x", conn))
    da.Fill(dt);

Fill 操作然后将行添加到目标 DataTable 对象 在DataSet 中,如果还没有创建DataTable 对象 存在。在创建DataTable对象时,Fill操作正常 仅创建列名元数据。但是,如果MissingSchemaAction 属性设置为AddWithKey,适当的主键和 约束也被创建。

我已经测试过了,它只是加载列名和类型,所有其他属性,如 AllowDbNullMaxLength 都有它们的默认值,可能是对的,也可能是错的。

【讨论】:

  • 哦,这很有趣......等等。谢谢!
  • 嗯,是的,我最近才发现一些问题,这就是我放弃DataAdapter的原因。它“太聪明了”,因为如果您将它用于视图(而不是表),那么它将为基础表而不是视图创建删除/更新/插入命令。如果您使用的安全设置只允许访问视图而不是表,那么这很糟糕。但那是另一回事了。
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
相关资源
最近更新 更多