我编写了一个简单的测试应用程序,它使用参数调用 MySql 存储过程并使用结果填充 DataTable。
当我安装了 MySQL ODBC 8.0 UNICODE 驱动程序并在查询字符串中指定时,它可以正常工作。当我将驱动程序更新到 8.1 并将连接字符串更改为使用 8.1 时,该命令失败并出现以下错误:
ERROR [42000] [MySQL][ODBC 8.1(w) Driver][mysqld-8.0.34-commercial]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{ call GetDashboardData(?, ?) }' at line 1'
这是应用程序的代码,升级连接器驱动程序后我唯一更改的是连接字符串中的 8.0 更改为 8.1(这成功连接到数据库)
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();
OdbcCommand command = new OdbcCommand("{ call 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);
}
我没有看到任何提及这些版本之间可能发生的任何变化,从而可能影响这一点。任何帮助将不胜感激
编辑
如果我创建一个不带参数的存储过程并将命令文本设置为:
{ call GetDashboardData() }
它有效。仅当尝试使用参数时才会出现此问题
事实证明这是 8.1 MySql 连接器的一个错误: https://bugs.mysql.com/bug.php?id=112285