C#调用LOAD DATA INFILE导入MySQL数据时触发致命执行错误
我帮你分析下这个问题,其实根源在于MySQL Connector/NET的默认设置和多语句执行的限制,咱们一步步来解决:
问题核心原因
你的代码在MySQL Workbench里能正常跑,但C#里报错,主要有两个关键问题:
- MySQL Connector/NET 默认禁止一次性执行多条用分号分隔的SQL语句(这是防SQL注入的安全默认),而你把
DELETE、ALTER TABLE和LOAD DATA三个语句写在同一个查询字符串里,触发了限制。 - 使用用户变量(
@col2、@col3)时,需要明确开启连接对用户变量的支持,否则Connector/NET会解析失败。
具体解决方案
1. 修改连接字符串,开启多语句和用户变量支持
在你的数据库连接字符串中添加两个关键参数:
// 示例连接字符串,根据你的实际配置调整 string connectionString = "server=localhost;database=你的数据库名;uid=用户名;pwd=密码;AllowMultiQueries=true;AllowUserVariables=true;";
AllowMultiQueries=true:允许执行多条分号分隔的SQL语句AllowUserVariables=true:让连接支持使用@开头的用户变量
2. 检查LOAD DATA的文件权限问题
你用的C://time_u.txt路径在Windows下语法没问题,但要注意MySQL服务的运行账户是否有读取该文件的权限。如果遇到权限报错,可以:
- 把文件放到MySQL默认有权限访问的目录(比如MySQL安装目录下的
data文件夹) - 改用
LOAD DATA LOCAL INFILE,同时在连接字符串再加AllowLoadLocalInfile=true;,并确保MySQL服务器开启了local_infile参数(执行SET GLOBAL local_infile = 1;)
3. 优化代码结构(推荐)
把多个SQL语句分开执行,不仅更容易排查问题,还能避免连接泄漏:
using (MySqlConnection mConn = new MySqlConnection(connectionString)) { mConn.Open(); // 执行删除操作 using (MySqlCommand cmd = new MySqlCommand("DELETE FROM time;", mConn)) { cmd.ExecuteNonQuery(); } // 重置自增主键 using (MySqlCommand cmd = new MySqlCommand("ALTER TABLE time AUTO_INCREMENT=1;", mConn)) { cmd.ExecuteNonQuery(); } // 执行数据导入 string loadQuery = @"LOAD DATA INFILE 'C://time_u.txt' INTO TABLE `time` CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES (@col2, @col3) SET date = @col2, hour = @col3;"; using (MySqlCommand cmd = new MySqlCommand(loadQuery, mConn)) { cmd.ExecuteNonQuery(); } }
用using语句可以自动释放数据库连接和命令资源,符合C#的最佳实践。
4. 额外权限检查
确保你的MySQL用户拥有FILE权限(LOAD DATA INFILE需要这个权限),可以执行以下SQL检查:
SHOW GRANTS FOR '你的用户名'@'localhost';
如果没有FILE权限,执行授权语句:
GRANT FILE ON *.* TO '你的用户名'@'localhost'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Lucas Heise
相关产品推荐
相关产品推荐

