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

时间:2019-01-07 22:55:17

标签: c# sql sql-server stored-procedures sql-server-2012

我正在做一些练习,其中之一是使用存储过程更新表记录,该存储过程询问记录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。我真的可以使用一些帮助。谢谢。

1 个答案:

答案 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是一个整数,因此+被解释为加法而不是字符串连接。