在SO和其他地方有一些类似的问题,但主要是使用php,我不明白。我正在尝试使用这样的62个表来恢复数据库:
string query = @"SET SQL_MODE= 'NO_AUTO_VALUE_ON_ZERO'; CREATE DATABASE " + dbName + " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE " + dbName + ";" + Environment.NewLine;
using (StreamReader reader = File.OpenText("C:\b.sql"))
{
string line = reader.ReadToEnd();
query += line; //almost 1700 lines.
}
// upto this i get the query correctly which works fine in phpMyAdmin.
MySqlCommand c = new MySqlCommand(query, conn);
c.ExecuteReader();
//but when I execute, throws: "Fatal error encountered during command execution."
为什么会这样?如果它是查询长度的cos,那么如何从应用程序执行如此大的查询?
答案 0 :(得分:1)
我不确定MySql的查询字符串的长度是否有限制。我的第一个想法是将巨大的1700行查询分解为单个查询。
string query = @"SET SQL_MODE= 'NO_AUTO_VALUE_ON_ZERO'; CREATE DATABASE " + dbName + " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" + Environment.NewLine;
MySqlCommand c;
c = new MySqlCommand(query, conn);
c.ExecuteNonQuery();
using (StreamReader reader = File.OpenText("C:\b.sql"))
{
string line = reader.ReadToEnd();
query = "USE " + dbName + "; " + line;
c = new MySqlCommand(query, conn);
c.ExecuteNonQuery();
}
这样您就可以创建数据库,然后单独运行每个查询。在不知道您的数据的情况下,这可以帮助您查明任何问题。如果您使用try catch块包围“ExecuteNonQuery”,则可以捕获任何失败的查询,并将它们放入日志文件中以查看批处理何时完成。
答案 1 :(得分:1)
尝试检查错误:
List<string> query = new List<string>(){
"SET SQL_MODE= 'NO_AUTO_VALUE_ON_ZERO';",
string.Format("CREATE DATABASE `{0}` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;", dbName),
string.Format("USE `{0}`;", dbName)}; // error string.Format("USE `{0}`;{1}", dbName)
/*
using (StreamReader reader = File.OpenText("C:\b.sql"))
{
while (reader.Peek() >= 0)
query.Add(reader.ReadLine());
}
*/
using (StreamReader reader = File.OpenText("C:\b.sql"))
{
string lines = reader.ReadToEnd();
string[] alines = lines.Split(';');
foreach(string q in alines)
query.Add(q);
}
foreach (string command in query)
{
try
{
using (MySqlCommand c = new MySqlCommand(command, conn))
{
c.ExecuteReader();
Console.WriteLine(string.Format("OK Command: {0}", command));
}
}
catch (Exception ex)
{
Console.WriteLine(string.Format("Error: {0}. Command: {1}", ex.Message, command));
break;
}
}
修改强>
为了获得更好的性能,您可以使用此类。我没试过,希望它运作良好:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using System.IO;
namespace MySQLHelperTest
{
public class MySQLTestingQuery
{
public MySqlConnection MyConnection { get; set; }
public string FileSql { get; set; }
public List<string> PreviousQuerys { get; set; }
public List<string> CorrectQuerys { get; private set; }
public string ErrorQuery { get; private set; }
public MySQLTestingQuery()
{
this.CorrectQuerys = new List<string>();
this.ErrorQuery = string.Empty;
}
public void Start()
{
FileInfo file = new FileInfo(this.FileSql);
if (!file.Exists)
throw new ApplicationException(string.Format("nonexistent file: '{0}'", this.FileSql));
if (this.PreviousQuerys != null)
foreach (string command in this.PreviousQuerys)
this.RunMySQLCommand(command);
try
{
foreach (string command in this.ReadQuerys(this.FileSql))
Console.WriteLine(command);
}
catch (ApplicationException ex)
{
throw ex;
}
catch (Exception ex)
{
throw new ApplicationException(string.Format("an unexpected error happened: {0}. ", ex.Message));
}
}
private void RunMySQLCommand(string command)
{
try
{
using (MySqlCommand c = new MySqlCommand(command, this.MyConnection))
{
c.ExecuteReader();
this.CorrectQuerys.Add(command);
}
}
catch (Exception ex)
{
this.ErrorQuery = command;
throw new ApplicationException(string.Format("error: {0}. command: {1}", ex.Message, command));
}
}
private IEnumerable<string> ReadQuerys(string file)
{
using (StreamReader sr = new StreamReader(file))
{
string query = string.Empty;
while (sr.Peek() >= 0)
{
query += (char)sr.Read();
if (query.EndsWith(";"))
{
yield return query;
query = string.Empty;
}
}
}
}
}
}