簡體   English   中英

使用存儲過程更新動態名稱表

[英]update dynamic name table with stored procedure

我正在做一些練習,其中之一是使用存儲過程更新表記錄,該存儲過程詢問記錄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,其中ProductID ='轉換為數據類型int時,轉換失敗。

我正在使用SQL Server 2012和Visual Studio2017。我真的可以使用一些幫助。 謝謝。

我強烈建議您使用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是整數,因此+被解釋為加法而不是字符串串聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM