我正在做一些练习,其中之一是使用存储过程更新表记录,该存储过程询问记录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中的值进行“硬编码”时,则会出现此错误:
消息245,级别16,状态1,过程动态更新
将nvarchar值“更新产品集[ProductName] = Helium(其中ProductID =')转换为数据类型int时,转换失败。
我正在使用SQL Server 2012和Visual Studio2017。我真的可以使用一些帮助。谢谢。
答案 0 :(得分:0)
我强烈建议您使用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
是一个整数,因此+
被解释为加法而不是字符串连接。