Получение сообщения об ошибке в 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(), И получите это сообщение:

Исключение: "System.Data.SqlClient.SqlException" в System.Data.dll
Дополнительная информация: Невозможно вставить значение NULL в столбец "id", таблица "DB.MDF.dbo.words"; столбец не допускает нулевые значения. Вставить не удается.

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

ОБНОВЛЕНИЕ: после вставки этого кода в начало функции Update() все работает нормально:



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

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

3 ответа

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



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

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

Я предполагаю, что проблема связана с последней пустой строкой в ​​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

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


    _dtWords.EndInit();

Другие вопросы по тегам