Как обновить запись после обновления с SP - PullRequest
1 голос
/ 04 августа 2010

Я имею дело со следующей проблемой: я использую хранимую процедуру MSSQL для отображения моих данных в DataGridView.Команды обновления и вставки работают, но есть одна проблема:

При вставке новой строки первичный ключ с автонумерацией не отправляется обратно в мой DataAdaptar.Таким образом, вставка в базу данных прошла успешно, но PK оставлен пустым в DataGridView.Я уже пробовал некоторые коды, такие как:

    private void _rowUpdated(object sender, SqlRowUpdatedEventArgs e)
    {
        if (e.Status == UpdateStatus.Continue && e.StatementType == StatementType.Insert)
        {
            cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT @@IDENTITY FROM " + e.Row.Table.TableName;

            DataRow r = dt.Rows[dt.Rows.Count - 1];
            r.ItemArray[0] = cmd.ExecuteScalar();
            //r.SetModified(); --> err?
            r.AcceptChanges();
        }
    }

в DataAdapter, но, похоже, ничего не работает.Все команды SQL работают нормально.

Когда я обновляю данные в DataGridView, все идеально.Но проблема в том, что порядок сортировки и ширина столбца регулируются.И это не то, чего я хочу.

Может ли кто-нибудь помочь мне с этой проблемой?

В поисках решения!

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Наконец-то нашел ответ и захотел поделиться им:

dt.RowChanged += new DataRowChangeEventHandler(_update_fields);


    private void _update_fields(object sender, DataRowChangeEventArgs e)
    {
        try
        {
            if (e.Action == DataRowAction.Add)
            {
                conn.Open();
                cmd = conn.CreateCommand();
                cmd.CommandText = "SELECT IDENT_CURRENT('" + e.Row.Table.TableName + "')";
                dt.Rows[dt.Rows.Count - 1][0] = int.Parse(cmd.ExecuteScalar().ToString()) + 1;
                dt.AcceptChanges();
                conn.Close();
            }
            adapt.Update(dt);
        }
        catch (SqlException ex)
        {
            Debug.WriteLine(ex.Message);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

Надеюсь, это сэкономит вам время! :)

Gr VeeWee

0 голосов
/ 04 августа 2010

Поскольку соединение с сервером sql прервано, @@ identity станет нулевым, и, следовательно, вы получите нулевое значение.

Здесь вы не можете использовать scope_identity (), поскольку его область действия ограничена местом, то есть процедурой вВаш случай, когда он вызывается.

ident_current () всегда возвращает последнее значение идентификатора для таблицы, которую вы указали.Это может работать некорректно в случае репликации

Update your commandText to ="Select ident_current("+e.Row.Table.TableName+")"

Вот результаты использования различных методов получения значения идентификатора.Замените dbo.M_PatientEntry именем вашей таблицы

select ident_current('dbo.M_PatientEntry')
---------------------------------------
13

select @@identity from dbo.M_PatientEntry    
---------------------------------------
NULL
NULL

select scope_identity()    
---------------------------------------
NULL

select scope_identity() from dbo.M_PatientEntry    
---------------------------------------
NULL
NULL

Также старайтесь избегать @@ Identity, вместо этого используйте scope_identity () или ident_current @@ identity, которое даст вам увеличенное значение результата таблицы триггеров, если вы используете триггер на том жетаблица, где происходит вставка.

см. эту документацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...