向datatable添加行时出现奇怪错误

时间:2012-06-29 06:03:58

标签: c# sql-server datatable sqldatareader

我希望你们能帮助我弄清楚为什么会这样。我一直在试图解决这个问题。

这是一个直接来自我的代码的示例(删除了无聊的位)

...(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
  8. 看来应该在第5列中的数据实际上出现在第3列中。但那是纯粹的猜测。

    我所知道的是,为了使用可以继续任意数量的不同类型数据的查询“动态”使用dataTable,最佳途径是使用GetSchemaTable()来检索它。

    我在调试器中看到了什么

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

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

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

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

4 个答案:

答案 0 :(得分:2)

方法DbDataReader.GetSchemaTable()返回包含列名称和类型的元数据表。它不是一个人们可以期待的空表。有关详细信息,请参阅MSDN

答案 1 :(得分:1)

对不起,GetSchemaTable检索给定表格的架构GetValues检索实际行数据。例如。您的dataTable将包含列名称,列类型等列(请参阅MSDN reference),而buffer将包含其代表与dataTable不同的实际数据包含。

答案 2 :(得分:0)

为什么不使用:

dataTable.Fill();

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

答案 3 :(得分:0)

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