查询在phpMyAdmin中工作正常但不是从应用程序(C#)

时间:2011-08-12 12:43:48

标签: c# mysql database-restore

在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,那么如何从应用程序执行如此大的查询?

2 个答案:

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

    }
}