我希望你们能帮助我弄清楚为什么会这样。我一直在试图解决这个问题。
这是一个直接来自我的代码的示例(删除了无聊的位)
...(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。
架构返回的特定列数据类型是(按列排序)
看来应该在第5列中的数据实际上出现在第3列中。但那是纯粹的猜测。
我所知道的是,为了使用可以继续任意数量的不同类型数据的查询“动态”使用dataTable,最佳途径是使用GetSchemaTable()来检索它。
我在调试器中看到了什么
当我进入调试器时,我看了一下从架构构建的dataTable类型与从reader.GetValues()返回到对象的类型。 它们完全相同。
似乎dataTable.Rows.Add(缓冲区)正在将列添加到应该位置的几列。但这不应该是可能的。尤其是从阅读器直接构建的架构。我在ExecuteReader()中使用了诸如“CommandBehavior.KeyInfo”之类的选项,但仍然发生了相同的错误。
注意:我需要以这种方式运行查询,以使最终用户能够暂停查询中读取。请不要建议我废弃它并使用SqlDataAdapter或DataTable.Load()解决方案。
我真的很感激任何帮助。谢谢!
答案 0 :(得分:2)
方法DbDataReader.GetSchemaTable()
返回包含列名称和类型的元数据表。它不是一个人们可以期待的空表。有关详细信息,请参阅MSDN
答案 1 :(得分:1)
对不起,GetSchemaTable
检索给定表格的架构,GetValues
检索实际行数据。例如。您的dataTable
将包含列名称,列类型等列(请参阅MSDN reference),而buffer
将包含其代表与dataTable
不同的实际数据包含。
答案 2 :(得分:0)
为什么不使用:
dataTable.Fill();
为什么一次手动加载一行?
答案 3 :(得分:0)
请检查您要插入哪个气体GUID数据类型的列行。我得到了同样的错误,发现在从csv文件中读取记录后插入记录时,csv文件中有几个空格。