2016-07-14 6 views
2

У меня есть DB таблицы (которая пуста в данном примере)Получение сообщения об ошибке в SqlDataAdapter.Update()

create table words 
(
    id int not null, 
    word nvarchar(50) not null 
) 

и DataGridView, который я заполняю так:



    private SqlConnection _conn; 
    private SqlDataAdapter _wordsAdapter; 
    private DataTable _wordsDataTable = new DataTable(); 
    private DataGridView _tblWords; 

    private void FillWords() 
    { 
     _wordsAdapter = new SqlDataAdapter(new SqlCommand("select id, word from words", _conn)); 
     _wordsAdapter.Fill(_wordsDataTable); 

     DataGridViewColumn column = new DataGridViewTextBoxColumn(); 
     column.DataPropertyName = "id"; 
     column.Name = "id"; 
     _tblWords.Columns.Add(column); 

     column = new DataGridViewTextBoxColumn(); 
     column.DataPropertyName = "word"; 
     column.Name = "word"; 
     _tblWords.Columns.Add(column); 

     _tblWords.DataSource = _wordsDataTable; 
    } 

    private void Update() 
    { 
     _wordsAdapter.InsertCommand = new SqlCommand("insert into words (id, word) values (@id, @word)", _conn); 
     SqlParameter p = _wordsAdapter.InsertCommand.Parameters.Add("@id", SqlDbType.Int); 
     p.SourceColumn = "id"; 
     p.SourceVersion = DataRowVersion.Original; 
     p = _wordsAdapter.InsertCommand.Parameters.Add("@word", SqlDbType.NVarChar); 
     p.SourceColumn = "word"; 
     p.SourceVersion = DataRowVersion.Original; 
     _wordsAdapter.Update(_wordsDataTable); 
    } 

Затем я заполняю одну строку _ tblWords с некоторыми значениями и звоните Update(). И получить это сообщение:

Exception брошенную: 'System.Data.SqlClient.SqlException' в System.Data.dll
Дополнительная информация: Не удается вставить значение NULL в столбец 'идентификатор', таблица «DB .MDF.dbo.words'; столбец не допускает нулей. INSERT не работает.

Почему значение 'id' не выбрано из DataTable? Что я делаю не так?

UPDATE: После вставки этого кода в начале функции Update(), все работает отлично:



    private void Update() 
    { 
     _wordsDataTable.Rows.Clear(); 
     _wordsDataTable.Rows.Add(0, "xxx"); 
     ... 

Таким образом, проблема возникает только тогда, когда я заполняю DataTable через DataGridView. Зачем?!

+0

Вы принимаете данные из DataGridView и вставить его в таблицу. Идентификационный столбец должен быть первичным ключом или столбцом идентификации, и, следовательно, он не позволяет вам вставлять дублирующее значение. Если вы хотите обновить столбец слов в таблице, используйте инструкцию UPDATE. –

+0

Стол пуст, поэтому в этом конкретном случае строка INSERTED. Нет дубликатов, потому что вставленная строка является первой строкой в ​​таблице. Но я все еще получаю ошибку. – cesarito

+0

Я пытаюсь запустить ваш код. Что такое '_cb'? – dev1998

ответ

0

Я предполагаю, что проблема связана с последней пустой строкой в ​​DataGridView.

Вы можете попробовать что-то вроде этого вместо последнего _wordsAdapter.Update(_wordsDataTable); линии

var haveDbNull = _wordsDataTable.Rows.Cast<DataRow>().ToLookup(r => r.ItemArray.Contains(DBNull.Value)); 

Debug.Print("have DbNull values: " + haveDbNull[true].Count()); // check this number in the Debug Output window 
Debug.Print("don't have DbNull values: " + haveDbNull[false].Count()); 

_wordsAdapter.Update(haveDbNull[false].ToArray()); // to update just the rows that dont have DBNull values 
+0

Введенная строка не имеет нулевых значений. Это проблема. Когда я вставляю его значение по значению через DataGridView, я получаю ошибку. Когда я вставляю его в DataTable программно, все в порядке. – cesarito

+0

Я не уверен, почему вы используете 'p.SourceVersion = DataRowVersion.Original;'. Вы должны удалить их или изменить их на 'p.SourceVersion = DataRowVersion.Current;' https://msdn.microsoft.com/en-us/library/system.data.datarowversion – Slai

+0

Я тоже пытался Ток, с тем же результатом. Если я удалю его вообще, произойдет еще одна ошибка, заявив, что значение параметра не указано. Проблема в том, что вместо DataTable вместо нулевого значения принимает значение null. – cesarito

0

я нашел какое-то решение. Я просто удаляю добавленную строку и добавляю те же значения программно.



    object[] rowValues = dt.Rows[row].ItemArray; 
    dt.Rows.RemoveAt(row); 
    dt.Rows.Add(rowValues); 

Кто-нибудь знает какой-либо менее уродливый способ сделать это?

0

Решение очень просто, как всегда ...


    _dtWords.EndInit(); 

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