gpt4 book ai didi

c# - 使用存储过程更新动态名称表

转载 作者:太空宇宙 更新时间:2023-11-03 14:46:15 25 4
gpt4 key购买 nike

我正在做一些练习,其中之一是使用存储过程更新表记录,该存储过程询问记录的 ID、列名以及更新后该记录将在该列中具有的值.

这是我的存储过程:

create proc UpdateDynamically

(
@ProdID int,
@Parameter varchar(50),
@Value varchar(50)
)
as
begin
declare @sql varchar(max);

set @sql = 'update Products set ' + QUOTENAME(@Parameter) + ' = ' + @Value + ' where ProductID = ' + CONVERT(int, @ProdID)

exec(@sql)
end

这是我的 C# 代码:

protected void btnAtualizar_Click(object sender, EventArgs e)
{
try
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
con.Open();
#region UPDATE
string aux = ddlNome.SelectedItem.Text;
string id = aux.Substring(0, aux.IndexOf('-'));
SqlCommand comm1 = new SqlCommand();
SqlParameter ProdID = new SqlParameter("@ProdID", Convert.ToInt32(id));
SqlParameter Value = new SqlParameter("@Value", txtValor.Text);
SqlParameter Parameter = new SqlParameter("@Parameter", ddlCampo.SelectedItem.Text);
comm1 = new SqlCommand("update_dynamically", con);
comm1.Parameters.Add(ProdID);
comm1.Parameters.Add(Value);
comm1.Parameters.Add(Parameter);
comm1.CommandType = CommandType.StoredProcedure;
comm1.ExecuteNonQuery();
#endregion
Response.Redirect("WebForm.aspx");
}
catch (SqlException sqlex)
{ Response.Write(sqlex.Message); }
catch (Exception ex)
{ Response.Write(ex.Message); }
finally
{ con.Close(); }
}

当我运行代码时,它没有给出任何错误,但记录没有更新,当我尝试“硬编码”SQL Server 中的值时,它给出了这个错误:

Msg 245, Level 16, State 1, Procedure UpdateDynamically,

Conversion failed when converting the nvarchar value 'update Products set [ProductName] = Helium where ProductID = ' to data type int.

我正在使用 SQL Server 2012 和 Visual Studio 2017。我真的需要一些帮助。谢谢。

最佳答案

我强烈建议您使用 sp_executesql 并尽可能传入参数:

create procedute UpdateDynamically (
@ProdID int,
@Parameter varchar(50),
@Value varchar(50)
) as
begin
declare @sql nvarchar(max);

set @sql = N'
update Products
set @Parameter = @Value where ProductID = @ProdID
';

set @sql = replace(@sql, '@Parameter', @Parameter);

exec sp_executesql @sql,
N'@value varchar(50), @ProdID int',
@value=@value, @ProdID=@ProdID

end;

您不能将 @Parameter 作为参数传递,因为这不允许用于标识符,只能用于文字值。

您的存储过程代码失败,因为 @ProdID 是一个整数,因此 + 被解释为加法而不是字符串连接。

关于c# - 使用存储过程更新动态名称表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54083026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com