-1

我希望你们能帮助我弄清楚为什么会发生这种情况。我一直在扯头发试图弄清楚这一点。

这是直接来自我的代码的示例(去掉了无聊的部分)

...(Set up the connection and command, initialize a datatable "dataTable")...

using (SqlDataReader reader = cmd.ExecuteReader())
{
   //Query storage object
   object[] buffer = new object[reader.FieldCount];

   //Set the datatable schema to the schema from the query
   dataTable = reader.GetSchemaTable();


   //Read the query
   while (reader.Read())
   {  
    reader.GetValues(buffer);
    dataTable.Rows.Add(buffer);
   }
}                        

错误是

输入字符串的格式不正确。无法存储在 NumericScale 列中。预期类型是 Int16。

架构返回的特定列数据类型是(按列排序)

  1. System.Data.SqlTypes.SqlInt32
  2. System.Data.SqlTypes.SqlInt32
  3. System.Data.SqlTypes.SqlByte
  4. System.Data.SqlTypes.SqlMoney
  5. System.Data.SqlTypes.SqlString
  6. System.Data.SqlTypes.SqlGuid
  7. System.Data.SqlTypes.SqlDateTime

看起来应该在第 5 列中的数据实际上出现在第 3 列中。但这纯粹是猜测。

我所知道的是,为了“动态地”使用数据表和可以继续任意数量不同类型数据的查询,最好的方法是使用 GetSchemaTable() 来检索它。

我在调试器中看到的

当我进入调试器时,我查看了从模式构建的 dataTable 的类型与从 reader.GetValues() 返回到对象的类型。它们完全一样

似乎 dataTable.Rows.Add(buffer) 正在将列添加到距应有的位置几列的位置。但这应该是不可能的。尤其是直接从阅读器构建的模式。我在 ExecuteReader() 中使用了诸如“CommandBehavior.KeyInfo”之类的选项,但仍然出现同样的错误。

注意:我需要以这种方式运行查询,以使最终用户能够在读取过程中暂停查询。请不要建议我放弃这个并使用 SqlDataAdapter 或 DataTable.Load() 解决方案。

我真的很感激任何帮助。谢谢!

4

4 回答 4

2

方法DbDataReader.GetSchemaTable()返回包含列名和类型的元数据表。这不是一张可以期待的空桌子。有关更多详细信息,请参阅MSDN

于 2012-06-29T06:15:29.370 回答
1

很抱歉,但会GetSchemaTable检索给定表的架构GetValues并检索实际的行数据。例如,您dataTable将包含列名称、列类型等列(请参阅MSDN 参考),而您buffer将包含其表示形式与所dataTable包含内容不同的实际数据。

于 2012-06-29T06:17:37.050 回答
0

你为什么不直接使用:

dataTable.Fill();

为什么您一次手动加载一行?

于 2012-06-29T06:14:08.450 回答
0

请检查您要插入的气体 GUID 数据类型的列行中的内容。我遇到了同样的错误,发现在从 csv 文件读取记录后插入记录时,csv 文件中有几个空格。

于 2015-11-06T09:48:53.967 回答