なぜこれが起こっているのかを理解するのを手伝ってくれることを願っています。私はこれを理解しようとして髪を引き裂いてきました。
これが私のコードからの直接の例です(退屈なビットが切り取られています)
...(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に表示されているように見えます。しかし、それは純粋な憶測です。
私が知っているのは、さまざまな種類のデータをいくつでも継続できるクエリでdataTableを「動的に」使用するには、GetSchemaTable()を使用してデータを取得するのが最善の方法です。
デバッガーで見たもの
デバッガーにアクセスしたときに、スキーマから構築されたdataTableの型と、reader.GetValues()からオブジェクトに返された型を確認しました。それらはまったく同じです。
dataTable.Rows.Add(buffer)が、本来あるべき場所から数列離れた列を追加しているようです。しかし、これは不可能なはずです。特に、スキーマがリーダーから直接構築されている場合。ExecuteReader()内で「CommandBehavior.KeyInfo」などのオプションを試してみましたが、同じエラーが発生しました。
注:エンドユーザーが読み取り中にクエリを停止できるようにするには、この方法でクエリを実行する必要があります。これを破棄してSqlDataAdapterまたはDataTable.Load()ソリューションを使用することを提案しないでください。
助けていただければ幸いです。ありがとうございました!