2012-02-22 2 views
2

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

При попытке добавить новую строку я получаю 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 s. Я делаю что-то неправильно? Как может 0 нарушить ограничение MaxLength?

+0

Вы уверены, что исключение поднято в строке, где вы добавляете строку вручную, а не на том, где вы загружаете таблицу из читателя? –

+0

Я так думаю, а затем выполняю через отладчик Visual Studio, это строка, связанная с исключением. – Armos

+1

Если ваш идентификатор не является текстовым столбцом, свойство MaxLength следует игнорировать. http://msdn.microsoft.com/en-us/library/system.data.datacolumn.maxlength.aspx –

ответ

1

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

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

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

0

Проверьте свойство MaxLength на вашем ID столбца в DataTable

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

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

+1

В C# это будет table.Columns [0] .MaxLength, и кажется, 0 ... – Armos

+0

ОК, которое должно быть свойством, которое вы можете установить, поэтому установите его как 10 или что-то, что вам также может потребоваться, чтобы установить DataColumn.DataType на указанный выше комментарий –

Смежные вопросы