查询不会更新表格。
查询不会更新表格。
我正在使用存储过程来完成更新查询,并且我已经设置了消息框在查询成功执行时显示。当我点击按钮时,消息框弹出,但表格没有更新。我在SQL Server中运行相同的查询,它更新了表格,但无法通过C#更新。
我已经在SQL Server中尝试了相同的代码,代码运行正常。当命令执行时,消息框弹出。
如果(IsUpdate)
{
MessageBox.Show("Clicked");
txtCustomerName.Enabled = false;
using(SqlConnection con = new SqlConnection(ApplicationSettings.ConnectionString()))
{
using(SqlCommand cmd = new SqlCommand("usp_customer_updateProducts",con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Contact", Contact);
cmd.Parameters.AddWithValue("@Address", address);
cmd.Parameters.AddWithValue("@PAN", PAN);
cmd.Parameters.AddWithValue("@VAT", VAT);
cmd.Parameters.AddWithValue("@CustomerName", CustomerName);
con.Open();
try
{
MessageBox.Show(CustomerName);
cmd.ExecuteNonQuery();
MessageBox.Show("Customer Updated Successfully", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
CustomerRecordForm crf = new CustomerRecordForm();
crf.Show();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
finally
{
con.Close();
}
}
}
}
以下是存储过程的代码:
ALTER procedure [dbo].[usp_customer_updateProducts]
(
@Contact varchar,
@Address varchar,
@PAN varchar,
@VAT varchar,
@CustomerName varchar
)
as
begin
update [dbo].[CustomerInfo]
set [ContactNo]=@Contact,
[Address]=@Address,
[PAN]=@PAN,
[VAT]=@VAT
where [CustomerID] = (select CustomerID from CustomerInfo where CustomerName=@CustomerName)
end
问题: Query does not update the table
原因: 在查询中,varchar数据类型没有分配长度,因此只会取一个字符。
解决方法:
1. 为varchar数据类型分配长度,确保其可以存储所需的字符数。
2. 检查每个列的数据类型和长度,确保它们与表中定义的列匹配。
3. 如果您知道客户ID,请将客户ID作为参数发送,而不是客户姓名,这将对您和SQL Server都有帮助。
4. 更新存储过程时,请确保定义了varchar参数的长度,并将其与表中的列匹配。
以下是更新后的存储过程示例:
ALTER procedure [dbo].[usp_customer_updateProducts]
(
@CustomerName varchar(100), -- 需要定义长度
@ContactNo varchar(2000),
@Address varchar(50),
@PAN varchar(50),
@VAT varchar(50) -- 如果您知道客户ID,请发送客户ID而不是客户姓名。
)
as
begin
SET NOCOUNT ON; -- 请使用SET NOCOUNT ON,它会稍微提高性能。
UPDATE [dbo].[CustomerInfo]
SET [ContactNo] = @ContactNo,
[Address] = @Address,
[PAN] = @PAN,
[VAT] = @VAT
WHERE CustomerName = @CustomerName -- 您可以直接在where条件中使用客户姓名。
end
根据您分享的查询和输入,有一个建议修改,目前您在过程中传递了,现在要么在
insert
时已经处理好确保不会插入重复的姓名记录到您的表中,要么这绝对是一个生产中遇到的错误。
现在来看看您当前的查询部分,您从前端传递了CustomerName
,所以根据这个姓名选择您的id
并将其保存在一个变量中,然后用于更新记录。
declare @CustomerId int set @CustomerId = (select CustomerID from CustomerInfo where CustomerName= 'YourCustomerName') update [dbo].[CustomerInfo] set [ContactNo] = 'YourContactNo', [Address] = 'YourAddress', [PAN] = 'YourPAN', [VAT] = 'YourVAT' where [CustomerID] = @CustomerId
为了调试目的,您可以从过程中返回这个id
并在代码中保存它,以检查到底是哪个id被用于更新。