MySQL secure-file-priv设空后C# ExecuteReader执行LOAD DATA异常求助
问题:C#执行LOAD DATA INFILE时MySQL自动追加默认路径导致文件找不到
我已在my.ini文件中设置secure-file-priv="",在MySQL WorkBench中执行以下SQL语句完全正常:
LOAD DATA INFILE '_FILEPATH.txt_' INTO TABLE tablename FIELDS TERMINATED BY ' ' LINES TERMINATED BY ' ' IGNORE 1 LINES (xxx, yyy, zzz)
但使用C#的DbDataReader.ExecuteReader执行相同语句时返回错误,提示文件不存在——MySQL自动在文件路径前追加了默认路径C:\ProgramData\MySQL\MySQL Server 8.0\Data\DBNAME,报错信息如下:
MySqlException: File 'C:\ProgramData\MySQL\MySQL Server 8.0\Data\DBNAME_FILEPATH.txt_' not found (OS errno 2 - No such file or directory)
我不想让MySQL添加该默认路径,求问题原因及解决办法。
问题原因
- 连接配置差异:MySQL WorkBench与C#的MySQL驱动(如MySqlConnector)默认连接参数不同。C#驱动默认会将
LOAD DATA INFILE的路径解析逻辑修改,若未明确配置,会把传入的路径视为服务器端数据库目录的相对路径,自动追加默认前缀。 - 路径传递问题:若SQL中使用的是相对路径,C#驱动未正确将其识别为客户端侧路径,导致MySQL服务器按自身数据目录规则拼接路径。
解决办法
方法1:修正连接字符串参数
在C#的数据库连接字符串中添加以下配置:
AllowLoadLocalInfile=true;Local=false
AllowLoadLocalInfile=true:允许客户端加载本地文件,确保驱动完整传递路径信息。Local=false:强制MySQL使用服务器端LOAD DATA INFILE的原生逻辑,避免路径被自动转换拼接。
如果文件在客户端本地,也可直接使用LOAD DATA LOCAL INFILE语句,但需确保MySQL服务器已开启local_infile参数(临时执行SET GLOBAL local_infile = ON;,或在my.ini中配置local_infile=1永久生效)。
方法2:使用完整绝对路径
确保SQL语句中的文件路径为绝对路径,例如:
LOAD DATA INFILE 'C:\\your\\real\\path\\file.txt' INTO TABLE tablename FIELDS TERMINATED BY ' ' LINES TERMINATED BY ' ' IGNORE 1 LINES (xxx, yyy, zzz)
在C#代码中可使用@符号简化路径转义:
string sql = @"LOAD DATA INFILE 'C:\your\real\path\file.txt' INTO TABLE tablename FIELDS TERMINATED BY ' ' LINES TERMINATED BY ' ' IGNORE 1 LINES (xxx, yyy, zzz)";
方法3:升级MySQL驱动
确保使用的MySqlConnector(或MySql.Data)为最新版本,旧版本驱动可能存在路径解析的bug,升级后可修复此类问题。
内容的提问来源于stack exchange,提问作者Mi-krater
相关产品推荐
相关产品推荐

