在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."


为什么会这样呢?如果它是查询长度的余弦,那么如何从应用程序执行如此大的查询?

最佳答案

试试这个检查错误:

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;
                    }
                }
            }
        }

    }
}

09-04 06:54
查看更多