升级MySQL ODBC 8.1后带参数存储过程调用失败求助
解决MySQL ODBC 8.1驱动调用带参数存储过程的语法错误
问题原因
MySQL ODBC 8.1驱动对存储过程调用的语法解析逻辑较8.0版本有变更:当设置CommandType = CommandType.StoredProcedure时,驱动会自动处理存储过程的调用格式,若手动在CommandText中添加{ call ... }包裹,会触发语法解析冲突,导致报错。无参数存储过程未报错是因为驱动对无参数场景的兼容性处理更宽松。
解决方案
有两种可行的修改方式:
方式1:直接使用存储过程名作为CommandText(推荐)
将OdbcCommand的CommandText改为存储过程名,保留CommandType = CommandType.StoredProcedure:
static void Main(string[] args) { var connection = new OdbcConnection("Driver={MySQL ODBC 8.1 UNICODE Driver}; Server=localhost; Database=theDatabase; Uid=theUser; Pwd=thePassword; "); connection.Open(); // 直接使用存储过程名,去掉{ call ... }包裹 OdbcCommand command = new OdbcCommand("GetDashboardData", connection); command.CommandType = CommandType.StoredProcedure; var param1 = command.CreateParameter(); param1.ParameterName = "timePeriodHours"; param1.Direction = ParameterDirection.Input; param1.Value = 24; param1.DbType = DbType.Int32; command.Parameters.Add(param1); var param2 = command.CreateParameter(); param2.ParameterName = "IdList"; param2.Direction = ParameterDirection.Input; param2.Value = "000"; param2.DbType = DbType.String; command.Parameters.Add(param2); DataTable table = new DataTable(); OdbcDataAdapter adapter = new OdbcDataAdapter(command); adapter.Fill(table); Console.WriteLine(table.Rows.Count); }
方式2:保留{ call ... }格式,修改CommandType为Text
如果需要保留原有的SQL调用格式,将CommandType改为CommandType.Text:
OdbcCommand command = new OdbcCommand("{ call GetDashboardData(?, ?) }", connection); // 修改为CommandType.Text command.CommandType = CommandType.Text;
注意:这种方式下,参数的顺序必须与存储过程定义的参数顺序完全一致,ParameterName可能不会被驱动识别,仅按位置绑定参数。
验证说明
修改后重新运行程序,带参数的存储过程调用即可正常执行并填充DataTable。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

