MySql.Data.MySqlClient调用存储过程时出错

时间:2018-07-27 22:33:27

标签: c# mysql

我遇到了一个问题,我认为这属于我所授予的特权。但是,我不知道为什么会这样。我在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 ;

我正在从我的C#应用​​程序中调用它。当我使用userA的凭据时,代码运行良好。但是,当我使用userB时,它不起作用。使用以下命令授予userA特权:

GRANT ALL PRIVILEGES ON * . * TO 'userA'@'%';
使用以下命令授予

userB特权:

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);

我没有错误。我并不是想让我的代码正常工作,而是希望它能正常工作。请帮助我了解导致此错误的原因。谢谢。

2 个答案:

答案 0 :(得分:1)

TL; DR

应该授予

userB SELECT访问mysql.proc表的权限。

说明

首先,执行MySQL Connnector / NET SHOW CREATE PROCEDURE my_stored_procedure以获取所有参数定义。 (顺序,方向,DbType等)

然后,它将结合过程名称和参数来创建一个像CALL my_stored_procedure(var_one, var_two)这样的SQL来执行。

  

要使用SHOW CREATE PROCEDURE,您必须是例程DEFINER子句中命名的用户,或具有SELECTmysql.proc表的访问权限。如果您没有例程本身的特权,则Create Procedure字段显示的值将为 NULL

     

-Doc: SHOW CREATE PROCEDURE Syntax
  -Issue: Connector 8.0 - Stored Procedure Error in MySqlDataReader

答案 1 :(得分:0)

授予用户B特权以执行 SP并将 CheckParameters = false 添加到连接字符串