我希望你们能帮助我弄清楚为什么会发生这种情况。我一直在扯头发试图弄清楚这一点。
这是直接来自我的代码的示例(去掉了无聊的部分)
...(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。
架构返回的特定列数据类型是(按列排序)
- System.Data.SqlTypes.SqlInt32
- System.Data.SqlTypes.SqlInt32
- System.Data.SqlTypes.SqlByte
- System.Data.SqlTypes.SqlMoney
- System.Data.SqlTypes.SqlString
- System.Data.SqlTypes.SqlGuid
- System.Data.SqlTypes.SqlDateTime
看起来应该在第 5 列中的数据实际上出现在第 3 列中。但这纯粹是猜测。
我所知道的是,为了“动态地”使用数据表和可以继续任意数量不同类型数据的查询,最好的方法是使用 GetSchemaTable() 来检索它。
我在调试器中看到的
当我进入调试器时,我查看了从模式构建的 dataTable 的类型与从 reader.GetValues() 返回到对象的类型。它们完全一样。
似乎 dataTable.Rows.Add(buffer) 正在将列添加到距应有的位置几列的位置。但这应该是不可能的。尤其是直接从阅读器构建的模式。我在 ExecuteReader() 中使用了诸如“CommandBehavior.KeyInfo”之类的选项,但仍然出现同样的错误。
注意:我需要以这种方式运行查询,以使最终用户能够在读取过程中暂停查询。请不要建议我放弃这个并使用 SqlDataAdapter 或 DataTable.Load() 解决方案。
我真的很感激任何帮助。谢谢!