Как обновить значение, заполненное ключом, через хранимые процедуры и DatagridView? - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть хранимая процедура, которая обновляет клиентов и сетку данных для работы с данными.Редактирование не первичных значений поля работает хорошо, но если я пытаюсь обновить значение поля первичного ключа, я получаю исключение «Нарушение параллелизма: команда UpdateCommand затронула 0 из ожидаемых 1 записей.»

Это мой sp:

create procedure dbo.UpdateCustomers
@CustomerID nchar(5),
@CompanyName nvarchar(40),
@ContactName nvarchar(30),
@ContactTitle nvarchar(30),
@Address nvarchar(60),
@City nvarchar(15),
@Region nvarchar(15),
@PostalCode nvarchar(10),
@Country nvarchar(15),
@Phone nvarchar(24),
@Fax nvarchar(24)
as
update Customers
set CustomerID = @CustomerID, CompanyName = @CompanyName, ContactName = @ContactName, ContactTitle = @ContactTitle, Address = @Address,
    City = @City, Region = @Region, PostalCode = @PostalCode, Country = @Country, Phone = @Phone, Fax = @Fax
where CustomerID = @CustomerID
go

И в коде:

public void UpdateData()
            {
                using (var cn = new SqlConnection(_cs))
                {

                    ....

                    var updateCmd = new SqlCommand("UpdateCustomers", cn);
                    updateCmd.CommandType = CommandType.StoredProcedure;

                    updateCmd.Parameters.Add(
                        new SqlParameter("@CustomerID", SqlDbType.NVarChar, 5, "CustomerID"));
                    updateCmd.Parameters.Add(
                        new SqlParameter("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName"));
                    updateCmd.Parameters.Add(
                        new SqlParameter("@ContactName", SqlDbType.NVarChar, 30, "ContactName"));
                    updateCmd.Parameters.Add(
                        new SqlParameter("@ContactTitle", SqlDbType.NVarChar, 30, "ContactTitle"));
                    updateCmd.Parameters.Add(
                        new SqlParameter("@Address", SqlDbType.NVarChar, 60, "Address"));
                    updateCmd.Parameters.Add(
                        new SqlParameter("@City", SqlDbType.NVarChar, 15, "City"));
                    updateCmd.Parameters.Add(
                        new SqlParameter("@Region", SqlDbType.NVarChar, 15, "Region"));

                    ...

                    _da.UpdateCommand = updateCmd;
                    var count = _da.Update(_ds, "Customers"); //exception
                    GetData();
                }
            }

Я понимаю, что когда эта процедура выполняется с новым CustomerID, нет строк, на которые повлияло обновление.Но как я могу передать из приложения новый и старый CustomerID?

Примерно так в SQL:

update Customers set CustomerID = 'NEWVALUE' where CustomerID = 'BSBEV'
....

и т. Д.

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Вы никогда не должны обновлять первичный ключ.

Я подозреваю, что вы получаете эту ошибку, потому что вы пытаетесь обновить несуществующую строку.

Возможно, вы захотите прочитать о Optimisitc Concurrency.

Если вы хотите изменить первичный ключ, вам, вероятно, следует просто вставить новую запись.Какова ваша причина для этого?

0 голосов
/ 24 февраля 2011

Используете ли вы личность в первичном ключе, который вы пытаетесь обновить?Если это так, вы должны удалить его, чтобы он мог быть отредактирован таким образом.

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