使用MySqlBulkLoader导入DataSet遇文件路径错误,请求技术支持
解决MySqlBulkLoader找不到文件的问题
你这是踩了MySqlBulkLoader的一个典型坑——这个工具是让MySQL服务器去读取指定路径的文件,而不是你的本地客户端程序读取。
错误原因分析
你把文件生成在Windows本地的C:\Users\Utilisateur\ds.txt,但你的MariaDB服务器部署在群晖(从报错路径/var/packages/MariaDB10/target/mysql/disk/能看出来),服务器所在的系统根本访问不到你Windows机器上的本地文件。哪怕把路径里的\换成/也没用,因为服务器完全找不到你Windows的C盘。
两种可行解决方案
方案1:将文件放到服务器可访问的路径
- 把生成的
ds.txt上传到群晖中MariaDB服务器有权限读取的目录,比如某个共享文件夹(示例路径:/volume1/your_shared_folder/) - 修改MySqlBulkLoader的
FileName为服务器上的绝对路径,比如:FileName = "/volume1/your_shared_folder/ds.txt" - 注意要确保MariaDB的运行进程拥有该文件的读取权限,否则还是会触发权限类报错。
方案2:跳过本地文件,直接批量插入数据
如果不想折腾文件上传,推荐用MySqlBulkCopy(需要使用MySqlConnector库,或更新版本的MySql.Data)直接把DataTable的数据发送到服务器,不需要生成中间文件,性能也不会打折扣:
private void button14_Click(object sender, EventArgs e) { using (var conn = new MySqlConnection(Globals.connString)) { conn.Open(); // 先清空目标表 MySqlCommand comm = new MySqlCommand("TRUNCATE Song", conn); comm.ExecuteNonQuery(); // 直接批量插入DataTable的数据 using (var bulkCopy = new MySqlBulkCopy(conn)) { bulkCopy.DestinationTableName = "Song"; // 显式指定目标表名,避免DataTable.ToString()的潜在问题 bulkCopy.WriteToServer(Globals.ds.Tables[0]); Console.WriteLine($"成功插入{Globals.ds.Tables[0].Rows.Count}行数据"); } } }
另外提个小细节:你原来代码里用Globals.ds.Tables[0].ToString()作为TableName,虽然DataTable的ToString默认返回表名,但显式写"Song"会更稳妥,避免意外问题。
内容的提问来源于stack exchange,提问作者Sebastien Chemouny
相关产品推荐
相关产品推荐

