-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列に保存できませんでした。予想されるタイプは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

列#5にあるはずのデータが実際には列#3に表示されているように見えます。しかし、それは純粋な憶測です。

私が知っているのは、さまざまな種類のデータをいくつでも継続できるクエリでdataTableを「動的に」使用するには、GetSchemaTable()を使用してデータを取得するのが最善の方法です。

デバッガーで見たもの

デバッガーにアクセスしたときに、スキーマから構築されたdataTableの型と、reader.GetValues()からオブジェクトに返された型を確認しました。それらはまったく同じです。

dataTable.Rows.Add(buffer)が、本来あるべき場所から数列離れた列を追加しているようです。しかし、これは不可能なはずです。特に、スキーマがリーダーから直接構築されている場合。ExecuteReader()内で「CommandBehavior.KeyInfo」などのオプションを試してみましたが、同じエラーが発生しました。

注:エンドユーザーが読み取り中にクエリを停止できるようにするには、この方法でクエリを実行する必要があります。これを破棄してSqlDataAdapterまたはDataTable.Load()ソリューションを使用することを提案しないでください。

助けていただければ幸いです。ありがとうございました!

4

4 に答える 4

2

メソッドは、列の名前とタイプを含むメタデータDbDataReader.GetSchemaTable()テーブルを返します。期待できる空のテーブルではありません。詳細については、MSDNを参照してください。

于 2012-06-29T06:15:29.370 に答える
1

申し訳ありませんが、特定のテーブルのスキーマGetSchemaTableを取得し、実際の行データを取得します。たとえば、列名、列タイプなどの列が含まれますが(MSDNリファレンスを参照)、実際のデータが含まれ、その表現は含まれているものとは異なります。GetValuesdataTablebufferdataTable

于 2012-06-29T06:17:37.050 に答える
0

使ってみませんか:

dataTable.Fill();

なぜ一度に1行ずつ手動でロードするのですか?

于 2012-06-29T06:14:08.450 に答える
0

どのガスGUIDデータタイプを列行に挿入しているかを確認してください。同じエラーが発生し、csvファイルからレコードを読み取った後にレコードを挿入しているときに、csvファイルにいくつかの空のスペースがあることがわかりました。

于 2015-11-06T09:48:53.967 に答える