【问题标题】:update dynamic name table with stored procedure使用存储过程更新动态名称表
【发布时间】:2019-06-02 15:04:00
【问题描述】:

我正在做一些练习,其中之一是使用存储过程更新表记录,该存储过程询问记录的 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 值 'update Products set [ProductName] = Helium where ProductID = ' 转换为数据类型 int 时转换失败。

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

【问题讨论】:

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


    【解决方案1】:

    我强烈建议您使用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 是一个整数,所以+ 被解释为加法而不是字符串连接。

    【讨论】:

    • 谢谢你,现在它工作正常。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多