обновить таблицу динамических имен с помощью хранимой процедуры - PullRequest
0 голосов
/ 08 января 2019

Я выполнял некоторые упражнения, и одним из них было обновить запись таблицы с помощью хранимой процедуры, которая запрашивает идентификатор записи, имя столбца и значение, которое эта запись будет иметь в этом столбце после обновления .

Это моя хранимая процедура:

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 Набор продуктов [ProductName] = Helium где ProductID =' в тип данных int.

Я использую SQL Server 2012 и Visual Studio 2017. Я мог бы действительно использовать некоторую помощь. Спасибо.

1 Ответ

0 голосов
/ 08 января 2019

Я настоятельно рекомендую вам использовать 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 является целым числом, поэтому + интерпретируется как сложение, а не как конкатенация строк.

...