【问题标题】:How can I add a new row to a table filled by an IDataReader?如何向由 IDataReader 填充的表添加新行?
【发布时间】:2012-02-22 15:19:45
【问题描述】:

我正在尝试向DataTable 添加一个新条目,然后我将它与包含在IDataReader 对象中的信息一起加载,具体来说是DbDataReader。加载正常,我认为对数据库的查询是正确的。

当尝试添加新行时,我得到一个 ArgumentException 并包含以下信息:

Cannot set column 'ID'. The value violates the MaxLength limit of this column.

这是我现在的代码:

// Build the query:
DbCommand cmd = dbCon.CreateCommand();
cmd.CommandText = "SELECT ID, Name || ' ' || SurName AS FullName FROM Clients ORDER BY FullName;";
// Execute it:
DbDataReader reader = cmd.ExecuteReader();
// Construct the table out of the query result:
DataTable table = new DataTable();
table .Load(reader);
table.Rows.Add(0, "None");

在数据库 (SQLite) 中,ID 的类型为 INTEGERNameSurName 均为 VARCHARs。难道我做错了什么? 0 怎么会违反 MaxLength 限制?

【问题讨论】:

  • 您确定异常是在您手动添加行的那一行引发的,而不是在您从阅读器加载表格的那一行吗?
  • 我认为是这样,然后通过 Visual Studio 调试器执行链接到异常的行。
  • 如果您的 ID 是非文本列,则应忽略 MaxLength 属性。 msdn.microsoft.com/en-us/library/…
  • @TimSchmelter 嗯...每当表为空时,我就会出现错误,查询没有返回任何行。当里面有东西时,例如 1 行 (1, "Test Test") 当表格被填充时,我在 Load() 方法中得到一个不同的异常: ConstraintException : 无法启用约束。一行或多行包含违反非空、唯一或外键约束的值。也许最好手动通过阅读器。
  • 您始终可以使用调试器查看导致ConstraintException 的原因。在 QuickWatch 对话框中执行 table.Load(reader)。然后执行table.GetErrors()。然后您可以在其RowError 属性中查看返回的行。瞧!

标签: c# sqlite datatable datareader


【解决方案1】:

最后,您通过使用我最喜欢的调试器“技巧”之一来消除奇怪的DataTable 异常,从而解决了这个问题。来自 cmets:

您始终可以通过使用 调试器。在 QuickWatch 对话框中执行 table.Load(reader)。 然后执行 table.GetErrors()。然后你可以查看 在其 RowError 属性处返回行。瞧!

由于我在几乎所有情况下都使用DbDataAdapter.Fill(DataTable),所以我忘记了DataTable.Load(IDataReader) 根据导入的IDataReader 的结果集推断架构。但当然,它至少需要一个DataRow 才能这样做。这就是 DataTable 不为空时它起作用的原因。

【讨论】:

    【解决方案2】:

    检查数据表中 ID 列的 MaxLength 属性

      size = dataTables(0).Columns(0).MaxLength 
    

    http://forums.asp.net/t/306971.aspx

    【讨论】:

    • 好的,这应该是您可以设置的属性,因此将其设置为 10 或您可能还需要根据上述评论设置 DataColumn.DataType
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2012-04-07
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    相关资源
    最近更新 更多