如何通过存储过程和 DatagridView 更新键填充值?

Posted

技术标签:

【中文标题】如何通过存储过程和 DatagridView 更新键填充值?【英文标题】:How to update key filled value via stored procedures and DatagridView? 【发布时间】:2011-02-24 18:10:39 【问题描述】:

我有更新客户的存储过程和一个数据网格视图来处理数据。 编辑非主字段值效果很好,但如果我尝试更新主键字段值,我会收到异常“并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条。”

这是我的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'
....

等等

【问题讨论】:

这看起来像可怕的设计,允许更新主键,除非我猜你对此有一些强烈的要求;无论如何,您可以添加另一个参数,例如 @NewCustomerID 并将其作为更新传递,无论如何您每次都在更新它,只需在不需要更新主键时将其设置为相同 @K Ivanov 我还以为更新PK真的很不正常,我只是在学习,想知道我能做什么 【参考方案1】:

你不应该更新主键。

我怀疑您收到此错误是因为您尝试更新不存在的行。

您可能想阅读Optimisitc Concurrency.

如果您想更改主键,您可能应该只插入一条新记录。你这样做的原因是什么?

【讨论】:

【参考方案2】:

您是否在尝试更新的主键上使用身份?如果是这样,您应该删除它以允许以这种方式对其进行编辑。

【讨论】:

以上是关于如何通过存储过程和 DatagridView 更新键填充值?的主要内容,如果未能解决你的问题,请参考以下文章

单个 datagridview 行更新

如何在 Windows 窗体 C# 中单击按钮通过 DataGridView 更新数据库中的布尔字段

如何在datagridview中插入、更新、删除?

使用存储过程 For XML Path 直接读入绑定到 DataGridView 的 DataSet?

删除DataGridView选中行并更新数据库

通过 datagridview 实时更新 MDB 数据库