首页 > 解决方案 > SET SESSION sql_mode 导致异常(.NET 连接器)

问题描述

我正在尝试使用 .NET 连接器(MySql.Data 版本 6.8.3.0)执行命令 'SET SESSION sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'。一切正常,除了我调用存储过程的情况。在这种情况下,它会导致异常 (0x80004005): Incorrect database name 'sakila

要恢复问题,这里是 C# 代码和构建测试数据库的简短脚本。请注意,评论这些行:

cmd.CommandText = "SET SESSION sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'";
cmd.ExecuteNonQuery();

消除了错误。

事实证明,在 MySQL 工作台中执行“SET GLOBAL sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'”会导致问题,即使这些行被注释但在 MySQL 工作台中没有被触发。

这是 C# 代码:

using MySql.Data.MySqlClient;
using System.Data;

namespace PadCharDBTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var conn = new MySqlConnection("Server=localhost;Database=testquestion;Uid=root;Pwd=*****;"))
            {
                conn.Open();
                using(var cmd = new MySqlCommand(null, conn))
                {
                    //1.sets the sql mode
                    cmd.CommandText = "SET SESSION sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'";
                    cmd.ExecuteNonQuery();

                    // 2. simple select
                    cmd.CommandText = "select * from mytable";
                    using (var r = cmd.ExecuteReader()) { }                         

                    // 3. stored procedure                  
                    cmd.CommandText = "getTopNames";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add(new MySqlParameter("top", MySqlDbType.Int32, 3));
                    using (var reader = cmd.ExecuteReader()) { }
                }
            }
        }
    }
}

这是构建测试数据库的 SQL 脚本:

CREATE DATABASE IF NOT EXISTS testQuestion;
USE testQuestion;

DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable (
  Id int(11) NOT NULL AUTO_INCREMENT,
  Name varchar(45) NOT NULL,
  PRIMARY KEY (`Id`)
);

INSERT INTO mytable (Name) 
VALUES
    ('AAA'),
    ('BBB'),
    ('CCC'),
    ('DDD'),
    ('EEE');


DROP PROCEDURE IF EXISTS getTopNames;

DELIMITER $$
CREATE PROCEDURE getTopNames (IN top INT)
BEGIN
    SELECT * FROM mytable LIMIT top;
END$$

DELIMITER ;

谢谢

标签: c#mysql.net

解决方案


推荐阅读