2012-02-22 2 views
2

IDataReaderオブジェクト(具体的にはDbDataReader)に含まれる情報を読み込んだ後、新しいエントリを追加しようとしています。読み込みがうまくいって、データベースへのクエリが正しいと思います。IDataReaderで埋められたテーブルに新しい行を追加するにはどうすればよいですか?

私は、以下の情報をArgumentExceptionを取得し、新しい行を追加しようとしている:データベースに

// Build the query: 
DbCommand cmd = dbCon.CreateCommand(); 
cmd.CommandText = "SELECT ID, Name || ' ' || SurName AS FullName FROM Clients ORDER BY FullName;"; 
// Execute it: 
DbDataReader reader = cmd.ExecuteReader(); 
// Construct the table out of the query result: 
DataTable table = new DataTable(); 
table .Load(reader); 
table.Rows.Add(0, "None"); 

(SQLiteの)ID

Cannot set column 'ID'. The value violates the MaxLength limit of this column. 

これは私が今持っているコードです。タイプINTEGERであり、NameSurNameの両方がVARCHARです。私は何か間違っているのですか? 0はどのようにしてMaxLengthの制限に違反することができますか?

+0

行を手動で追加する行ではなく、読者からテーブルをロードする行ではなく、例外が発生していますか? –

+0

私はそう考えて、例外にリンクされた行であるVisual Studioデバッガを介して実行します。 – Armos

+1

IDが非テキスト列の場合、MaxLengthプロパティは無視してください。 http://msdn.microsoft.com/en-us/library/system.data.datacolumn.maxlength.aspx –

答えて

1
最後

あなたはDataTable奇妙な非ごまかすに私の好きなデバッガ「トリック」のいずれかを使用して問題を解決してきました例外。コメントより:

デバッガを使用すると、ConstraintExceptionの原因を常に見ることができます。 QuickWatchダイアログボックスでtable.Load(reader)を実行します。 その後、table.GetErrors()を実行します。次に、RowErrorプロパティで返された行 を調べることができます。 Voilà!

私はほとんどすべてのケースでDbDataAdapter.Fill(DataTable)を使用していますので、私はDataTable.Load(IDataReader)インポートIDataReaderからの結果セットに基づいてスキーマを推測することを忘れてしまいました。しかし、それには少なくとも1つのDataRowが必要です。これは、DataTableが空でないときに動作する理由です。

0

であなたのID列のMaxLengthプロパティをチェックし、あなたのDataTable

size = dataTables(0).Columns(0).MaxLength 

http://forums.asp.net/t/306971.aspx

+1

C#ではtable.Columns [0] .MaxLengthになり、0と思われます... – Armos

+0

okこれは設定可能なプロパティである必要があります.10以上の値に設定すると、上記のコメントごとにDataColumn.DataTypeを設定する必要があります –

関連する問題