MySql.Data.MySqlClient Ошибка при вызове хранимой процедуры

0

Я сталкиваюсь с проблемой, которая, как я полагаю, лежит в моих привилегиях. Однако я не могу понять, почему это происходит. У меня есть хранимая процедура в MySQL, определяемая:

DELIMITER //
CREATE PROCEDURE my_stored_procedure (var_one VARCHAR(20), var_two INT4)
BEGIN 
    UPDATE table_name SET ACTIVATION_DATE = UTC_TIMESTAMP(), 
    DEACTIVATION_DATE = TIMESTAMPADD(MONTH, var_two, UTC_TIMESTAMP()),
    USER_ACTIVATED = 1 WHERE ID = var_one;
END //
DELIMITER ;

Я вызываю это из своего приложения С#. Код работает нормально, когда я использую учетные данные userA. Однако, когда я использую userB, он не работает. Пользователю были предоставлены привилегии с помощью команды:

GRANT ALL PRIVILEGES ON * . * TO 'userA'@'%';

Пользователю были предоставлены привилегии с этими командами:

GRANT UPDATE, SELECT ON current_db.table_im_updating TO 'userB'@'%';
GRANT EXECUTE ON PROCEDURE my_stored_procedure TO 'userB'@'%';

Мой код для вызова хранимой процедуры mysql выглядит следующим образом:

connection = new MySql.Data.MySqlClient.MySqlConnection("server=ip_address; port=3306; database=data_base; UID=userA; password=password; pooling=false");
MySql.Data.MySqlClient.MySqlCommand command = new MySql.Data.MySqlClient.MySqlCommand();
command.Connection = connection;
command.CommandText = "my_stored_procedure";
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.AddWithValue("@_id","associated_id");
command.Parameters["@_id"].Direction = System.Data.ParameterDirection.Input;
command.Parameters.AddWithValue("@subscription_length", "6");
command.Parameters["@subscription_length"].Direction = System.Data.ParameterDirection.Input;
command.ExecuteNonQuery();

Как я уже говорил. Этот код отлично работает при вводе пароля userA и userA; но когда я переключаюсь на userB, ошибка говорит:

System.Data.SqlTypes.SqlNullValueException: "Данные являются нулевыми. Этот метод или свойство не может быть вызван значениями Null. '

Также стоит отметить, что если я изменю свой метод вызова процедуры на это:

MySql.Data.MySqlClient.MySqlCommand command = new MySql.Data.MySqlClient.MySqlCommand("CALL my_stored_procedure(var_one, var_two)", connection);

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

  • 0
    Несвязанные советы: задавая вопрос об исключении, всегда указывайте, по какой из строк оно произошло. MySqlConnection и MySqlCommand являются IDisposable поэтому каждый должен быть в блоке using . Input является направлением по умолчанию, поэтому вам не нужно указывать это. Кроме того, вы можете посмотреть, можем ли мы прекратить использовать AddWithValue .
  • 0
    Спасибо за совет, я начал использовать функцию .Add () и определял SQLDataTypes, чтобы избежать нежелательной потери данных, используя функцию .AddWithValue (). Я также признателен за совет по правильной обработке неуправляемых данных.
Теги:

2 ответа

1
Лучший ответ

TL; DR

userB должен быть предоставлен с помощью доступа SELECT к таблице mysql.proc.

Explaination

Во-первых, MySQL Connnector/NET выполняется SHOW CREATE PROCEDURE my_stored_procedure для определения всех параметров. (Заказ, Направление, DbType и т.д.)

Затем он объединит имя и параметры процедуры для создания sql, например CALL my_stored_procedure(var_one, var_two) для выполнения.

Чтобы использовать SHOW CREATE PROCEDURE DEFINER, вы должны быть именованным пользователем в подпрограмме DEFINER или иметь доступ SELECT к таблице mysql.proc. Если у вас нет прав для самой процедуры, значение, отображаемое для поля " Create Procedure будет NULL.

- Doc: ПОКАЖИТЕ ПРОЦЕДУРА СОЗДАНИЯ Синтаксис
- Проблема: Connector 8.0 - Ошибка хранимой процедуры в MySqlDataReader

  • 0
    Благодарю за ваш ответ. Я обновлю вас после тестирования изменений.
  • 0
    Я использовал GRANT SELECT ON . Для пользователя. Это прояснило мою проблему. Я ценю помощь в выяснении моей ошибки.
0

Дайте пользователю B привилегии на выполнение SP и добавьте CheckParameters = false в строку подключения

  • 0
    Стоит отметить, что если вы добавите CheckParameters = false в строку подключения, имена параметров будут игнорироваться, и все параметры должны быть добавлены в команду в том же порядке, который ожидает proc.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню