如何通过存储过程和 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 更新键填充值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 窗体 C# 中单击按钮通过 DataGridView 更新数据库中的布尔字段