Как выбрать выходной параметр из MySql Процедура входа net - PullRequest
2 голосов
/ 05 мая 2020

Предположим, у нас есть такая хранимая процедура

CREATE PROCEDURE CopyValue(IN src INT, OUT dest INT)
BEGIN
    SET dest = src;
END

Я хочу вызвать это из приложения. net (предположим, что соединение et c создано успешно)

var sql = "call CopyValue(100, @destValue); select @destValue as Results;";

Строка в приведенном выше операторе отлично работает при вызове в MySql Workbench.

Однако это - очевидно - не работает с «MySqlException: параметр '@destValue' должен быть определен», когда выполняется на объекте MySqlCommand в. net

Как мне организовать этот оператор, чтобы я мог захватить выходной параметр из существующей процедуры?

NB : я использую MySql 5.6, которую я не могу обновить в настоящее время.

NB Вызов процедуры непосредственно с CommandType.StoredProcedure противоречит правилам компании.

Ответы [ 2 ]

1 голос
/ 11 мая 2020

Коллега (пожелавший остаться неизвестным) отлично ответил на это. По сути, ставьте обратные кавычки `после @ и в конце имени переменной, например,

@`MyParam`

Полностью рабочий пример.

static void Main(string[] args)
{
    using var con = new MySql.Data.MySqlClient.MySqlConnection("Data Source=localhost; User Id=...;Password=...;Initial Catalog=...");
    con.Open();
    using var cmd = con.CreateCommand();
    cmd.CommandText = "call CopyValue2(100, @`v2`); select @`v2` as Results;";
    using var reader = cmd.ExecuteReader();
    if (reader.Read())
        Console.WriteLine($"Copied Value {reader.GetInt64(0)}");
}

Спасибо OG :)

1 голос
/ 06 мая 2020

По умолчанию пользовательские переменные не разрешены в SQL операторах MySQL Connector /NET. Вы можете ослабить это ограничение, добавив AllowUserVariables=true; в строку подключения. Никаких изменений в вашем SQL или в том, как вы выполняете MySqlCommand, не требуется.

Для получения информации о почему это значение по умолчанию, вы можете прочитать исследование по этому поводу MySqlConnector проблема (которая также имеет такое же поведение по умолчанию, но гораздо лучшее сообщение об ошибке, которое расскажет вам, как решить проблему): https://github.com/mysql-net/MySqlConnector/issues/194

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...