【问题标题】:Fatal error encountered during command execution MysqlMysql执行命令时遇到致命错误
【发布时间】:2020-10-15 15:20:33
【问题描述】:

我正在开发一个小型应用程序,旨在将大量数据传输到 MySql 表中。 为此,我使用了加载数据 infile,但它向我返回此错误:在命令执行期间遇到致命错误。

然而,我之前已经使用过相同的代码并且它工作正常,但我真的看不出错误来自哪里。 txt文件中有写入数据的代码:

    public static void WriteDataTable(DataTable sourceTable, TextWriter writer, bool includeHeaders)
    {
        if (includeHeaders)
        {
            IEnumerable<String> headerValues = sourceTable.Columns
                .OfType<DataColumn>()
                .Select(column => QuoteValue(column.ColumnName));

            writer.WriteLine(String.Join("µ", headerValues));
        }

        IEnumerable<String> items = null;

        int i = 1;
        foreach (DataRow row in sourceTable.Rows)
        {
            items = row.ItemArray.Select(o => QuoteValue(o?.ToString().Replace(',', '.').Replace("\r\n", " ") ?? String.Empty));
            writer.WriteLine(String.Join("µ", items));
            if (i == 3) break;
            i++;
        }

        writer.Flush();
    }

    private static string QuoteValue(string value)
    {
        return Regex.Replace(String.Concat("\"", value.Replace("\"", "\"\""), "\""), @"\\", @"\\");
    }

里面有调用load data infile的代码:

        string tempFileCsv = Environment.CurrentDirectory + @"\UserData\tempUsers.txt";

        try
        {
            using (StreamWriter writer = new StreamWriter(tempFileCsv))
            {
                WriteCsv.WriteDataTable(dt, writer, false);
            }
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        //Injection via sql
        try
        {
            string query = @"LOAD DATA LOCAL INFILE '" + tempFileCsv + "' INTO TABLE users FIELDS TERMINATED BY 'µ' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' ";
            MySqlCommand commandCreate;

            commandCreate = new MySqlCommand(query, this.mysqlCo);
            commandCreate.ExecuteNonQuery();
        }
        catch (MySqlException e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }
        Console.WriteLine("Données chargées avec succès !");
        //System.IO.File.Delete(tempFileCsv);

这是我的 txt 文件内容的示例:

"1"µ"SYSTEM"µ"MCP133"µ"PARFILUX"µ"W:\\WINBOOKS\\DATA\\PARFILUX"µ"F"µ""
"2"µ"SYSTEM"µ"MCP133"µ"TEST"µ"W:\\WINBOOKS\\DATA\\TEST"µ"F"µ""
"3"µ"SYSTEM"µ"MCP133"µ"CJARDIN2"µ"W:\\WINBOOKS\\DATA\\CJARDIN2"µ"F"µ""

这是我的 mysql 表的结构:

提前致谢 ;)

调试中的内容查询:

【问题讨论】:

  • 你为什么要用这么奇怪的分隔符? “在命令执行期间遇到致命错误”应该意味着执行 SQL 查询时存在内部异常。 WriteDataTable 方法似乎也很复杂,但我们假设它有效。你能调试到分配字符串query的地步并显示内容吗?
  • string tempFileCsv = Environment.CurrentDirectory + @"\UserData\tempUsers.txt" 真的会生成正确的文件存储路径吗?
  • 您是否验证了文件以 \r\n 结尾以及异常发生在哪里?是否在 MySqlException 捕获上?
  • 我使用了一个特殊的分隔符,但它可以正常工作。路径正确,文件生成良好我修改了我的帖子并添加了查询的内容
  • 当我尝试在行级别执行加载数据文件时导致错误:commandCreate.ExecuteNonQuery();

标签: c# mysql load-data-infile


【解决方案1】:

切换到MySqlConnector 并使用MySqlBulkCopy 类直接加载DataTable。

using var connection = new MySqlConnection("...;AllowLoadLocalInfile=True");
await connection.OpenAsync();
var bulkCopy = new MySqlBulkCopy(connection);
bulkCopy.DestinationTableName = "users";
await bulkCopy.WriteToServerAsync(dt);

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多