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