【问题标题】:Datatable.Load does not work with SqlCeReaderDatatable.Load 不适用于 SqlCeReader
【发布时间】:2012-03-26 03:06:11
【问题描述】:

我有这个方法:

public static DataTable ExecuteDataTable(IDbConnection connection, string cmdText)
{
    IDbCommand command = connection.CreateCommand();
    command.CommandText = cmdText;
    command.CommandType = CommandType.Text;
    IDataReader reader = command.ExecuteReader();
    DataTable dt = new DataTable();
    dt.Load(reader);
    return dt;
}

当我针对 SQLConnection 类型的连接执行查询 select * from information_schema.Tables 时,一切正常。 但是,当我尝试针对SqlCEConnection 类型的连接运行它时,dt.Load(reader) 行会引发异常:

System.Data.ConstraintException: Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

【问题讨论】:

  • 您可以随时查看DataTable 以了解导致ConstraintException 的原因。在dt.Load(reader); 行设置断点。用户 Quick-Watch Window 执行此行。然后您可以使用dt.GetErrors() 获取所有有错误的行。然后您可以查看每个返回的 DataRow 的 RowError 属性以了解实际原因。
  • 感谢 GetErrors() 方法的提示。我明白了:RowError:“列 'DATE_MODIFIED' 不允许 DBNull.Value。” SqlCE 似乎返回了比 SQL Server 2005 更多的列,但将它们保留为 NULL。

标签: c# datatable connection sql-server-ce datareader


【解决方案1】:

当然是一个奇怪的问题,但这里有一个替代方案:

将数据读入 DataSet 并将 EnforceConstraints 设置为 false。然后你可以返回DataSet.Tables[0]

【讨论】:

  • 谢谢。我现在将数据集与适用于我的 EnforceConstraints=false 结合使用。
猜你喜欢
  • 2019-07-29
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2012-08-30
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多