2012-06-29 131 views
-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正确format.Couldn't店柱。预期的类型是Int16。

如由模式返回的特定列中的数据类型(由列排序)

  1. System.Data.SqlTypes.SqlInt32
  2. System.Data.SqlTypes.SqlInt32
  3. 系统。 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(缓冲区)正在从应该从哪里添加几列。但这不应该是可能的。特别是在读者构建的模式是直接。我在ExecuteReader()中使用了诸如“CommandBehavior.KeyInfo”之类的选项,并且仍然发生相同的错误。

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

我非常感谢任何帮助。谢谢!

+0

当然#TYPE#不是敏感信息吗?你可以给我们的信息越多越好。 –

+0

添加了更多细节。认为很多规范是不必要的。 –

回答

1

我很抱歉,但GetSchemaTable检索模式给定表和GetValues检索实际行数据。例如。您的dataTable将包含列名称,列类型等(请参阅MSDN reference),而您的buffer将包含其表示方式与dataTable不同的实际数据。

+0

现在想通了。您需要两个数据表,然后引用包含要查找的内容的列/行对。谢谢。 –

0

你为什么不只是使用:

dataTable.Fill(); 

你为什么手动加载它一行在同一时间?

2

方法DbDataReader.GetSchemaTable()返回元数据包含列名和类型表。这不是一个人们可以期待的空桌子。欲了解更多详情,请参见MSDN

0

请检查你所插入的列GUID数据类型。我得到了同样的错误,发现在从csv文件读取记录后插入记录时,在csv文件中有几个空白空间。

相关问题