C# Как передать переменную sql

Я пытаюсь вставить некоторые значения в базу данных mysql через С#

INSERT INTO cliente (column1, column2) VALUES (value1, value2);
set @ultima_pk =  LAST_INSERT_ID();
INSERT INTO cliente_ref (refCol1, refCol2) VALUES (refvalue1, (SELECT @ultima_pk));
INSERT INTO cliente_ref (refCol1, refCol2) VALUES (refvalue1, (SELECT @ultima_pk));

Когда я тестирую его только в mysql, он работает отлично, но когда я пытаюсь вставить его через С#, я не могу.

Сообщение об ошибке:

Parameter '@ultima_pk' must be defined.

Но @ultima_pk не является параметром, это переменная mysql.

Ниже функция вставки

public bool insert(string query)
{
    this.conectar();

    cmd = new MySqlCommand(query, this.conexion);

    cmd.ExecuteReader();
    //bool retornar = cmd.ExecuteNonQuery() >= 1 ? true : false;
    bool retornar = true;
    this.desconectar();

    return retornar;
}

Связь работает отлично.

Любое предложение. Как я могу передать @ultima_pk внутри запроса на C#?


person gvd    schedule 14.06.2015    source источник
comment
Метод insert() здесь заставит вас написать код, который ужасно уязвим для атак SQL-инъекций, потому что в нем отсутствует механизм для приема данных параметров, которые отделены от строки запроса.   -  person Joel Coehoorn    schedule 15.06.2015
comment
Какое еще предложение вы мне порекомендуете?   -  person gvd    schedule 15.06.2015
comment
Смотрите мой ответ, как это сделать.   -  person Joel Coehoorn    schedule 15.06.2015
comment
Спасибо всем. Я нашел ответ здесь. stackoverflow.com/questions/21795565/ Добавление AllowUserVariables=True в строку подключения   -  person gvd    schedule 17.06.2015


Ответы (1)


Вам нужно объявить его, и тогда вам не нужно его выбирать:

DECLARE @ultima_pk int;
INSERT INTO cliente (column1, column2) VALUES (value1, value2);
set @ultima_pk =  LAST_INSERT_ID();
INSERT INTO cliente_ref (refCol1, refCol2) VALUES (refvalue1, @ultima_pk);
INSERT INTO cliente_ref (refCol1, refCol2) VALUES (refvalue1, @ultima_pk);

Назовите это так:

public bool insert_cliente(string value1, string value2, string refvalue, string refvalue2)
{
    string query = @"
    DECLARE @ultima_pk int;
    INSERT INTO cliente (column1, column2) VALUES (@value1, @value2);
    set @ultima_pk =  LAST_INSERT_ID();
    INSERT INTO cliente_ref (refCol1, refCol2) VALUES (@refvalue1, @ultima_pk);
    INSERT INTO cliente_ref (refCol1, refCol2) VALUES (@refvalue2, @ultima_pk);";

    cmd = new MySqlCommand(query, this.conexion);

    //I had to guess at parameter types/lengths. Use the actual column definitions from your database for this
    cmd.Parameters.Add("@value1", MySqlDbType.VarChar, 50).Value = value1;
    cmd.Parameters.Add("@value2", MySqlDbType.VarChar, 50).Value = value2;
    cmd.Parameters.Add("@refvalue", MySqlDbType.VarChar, 50).Value = refvalue;
    cmd.Parameters.Add("@refvalue2", MySqlDbType.VarChar, 50).Value = refvalue2;

    try 
    { 
        this.conectar();
        return (cmd.ExecuteNonQuery() >= 1);
    }
    finally
    {
        this.desconectar();
    } 
}
person Joel Coehoorn    schedule 14.06.2015
comment
Для mysql DECLARE @ultima_pk int; это недействительно. Вам нужно только использовать set @ultima_pk = LAST_INSERT_ID(); согласно справочнику. Отрезанный код sql, который я показываю в своем посте, был протестирован с mysql (из C#) и отлично работает. Проблема здесь в С#. - person gvd; 15.06.2015
comment
Вы так говорите, а сообщение об ошибке говорит вам, что переменная @ultima_pk не определена. Попробуем дать определение. - person Joel Coehoorn; 15.06.2015
comment
Я подтверждаю ваше предложение, но получаю ту же ошибку {Параметр '@ultima_pk' должен быть определен.}. Для меня нет смысла, работайте в mysql, а не в C#. - person gvd; 15.06.2015