c# - 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 ;
谢谢
解决方案
推荐阅读
- hadoop - 在 hive 上初始化 Derby 时解析失败
- sql - SQL - 显示第一个表中的所有值
- mongodb - 用于 mongo db 的 Docker 文件
- r - 变异函数不能与函数函数一起使用
- json - 在 Python 中写入文件时从 JSON 中删除 '[
- javascript - 分页帮助命令 Discord.js v12
- r - 在 R 中收集多列
- python - 将 pandas 中的日期字段替换为下一列中的日期值
- azure - 使用 Azure Devops 和 Yaml 和变量组为 Azure 函数应用部署 Appsettings
- ios - 当表视图范围内的值更新时,更新表视图范围之外的值