Как я могу добавить новую строку в таблицу, заполненную IDataReader? - PullRequest
2 голосов
/ 22 февраля 2012

Я пытаюсь добавить новую запись в DataTable после загрузки ее с информацией, содержащейся в IDataReader объекте, DbDataReader конкретно. Загрузка идет нормально, и запрос к базе данных правильный, я думаю.

При попытке добавить новую строку я получаю ArgumentException со следующей информацией:

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

Это код, который у меня сейчас есть:

// 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 имеет тип INTEGER, и оба Name и SurName имеют значение VARCHAR с. Я делаю что-то неправильно? Как 0 может нарушить ограничение MaxLength?

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Наконец-то вы решили проблему, используя один из моих любимых «приемов» отладчика, чтобы устранить неверные странные DataTable исключения. Из комментариев:

Вы всегда можете посмотреть, что вызывает ConstraintException, используя отладчик. Выполните table.Load (читатель) в диалоговом окне QuickWatch. Затем выполните table.GetErrors (). Тогда вы можете посмотреть в возвращенные строки в их свойстве RowError. Вуаля!

Поскольку я использую DbDataAdapter.Fill(DataTable) почти во всех случаях, я забыл, что DataTable.Load(IDataReader) выводит схему на основе результирующего набора из импортированного IDataReader , Но, конечно, для этого нужен хотя бы один DataRow. Вот почему это работает, когда DataTable не был пустым.

0 голосов
/ 22 февраля 2012

Проверьте свойство MaxLength в столбце идентификатора в таблице данных

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

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

...