c# - 使用 mysql 和 c# 恢复功能不起作用

标签 c# .net mysql winforms database-restore

我正在尝试通过以下方法使用 c# 恢复数据库文件 (backup.sql)...

                string hostaddress = "localhost";
                try
                {
                  string pathforbackupfile = @"C:\folder\Access\backupdb\backup.sql";
                  StreamReader file = new StreamReader(pathforbackupfile);
                  string input = file.ReadToEnd();
                  //file.Close();

                  ProcessStartInfo psi = new ProcessStartInfo();
                  psi.FileName = @"C:\wamp\bin\mysql\mysql5.5.8\bin\mysql.exe";
                  psi.RedirectStandardInput = true;
                  psi.RedirectStandardOutput = true;
                  psi.CreateNoWindow = true;

                  psi.Arguments = string.Format(@"-u {0} -h {1} {2}", "root", hostaddress, "access");
                  psi.UseShellExecute = false;
                  Process p = Process.Start(psi);
                  //p.StandardInput.WriteLine(input);
                  p.StandardInput.Write(input);
                  p.StandardInput.Close();
                  p.WaitForExit();
                  p.Close();

但是我没有恢复数据库..

上面的代码有什么问题..

编辑:

这是我的表结构之一:

--
-- Table structure for table `banks`
--

DROP TABLE IF EXISTS `banks`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `banks` (
  `bank_Id` int(11) NOT NULL AUTO_INCREMENT,
  `bank_Tag` varchar(32) NOT NULL DEFAULT '',
  `bank_Name` varchar(32) NOT NULL DEFAULT '',
  `bank_Address1` varchar(32) NOT NULL,
  `bank_Address2` varchar(32) NOT NULL,
  `bank_Address3` varchar(32) NOT NULL,
  `bank_Town` varchar(32) NOT NULL,
  `bank_County` varchar(32) NOT NULL,
  `bank_Postcode` varchar(32) NOT NULL,
  `bank_Country` varchar(32) NOT NULL DEFAULT 'UK',
  `bank_Contact` varchar(32) NOT NULL DEFAULT '',
  `bank_Phone` varchar(32) NOT NULL DEFAULT '',
  `bank_Email` varchar(32) NOT NULL DEFAULT '',
  `bank_SortCode` varchar(16) NOT NULL DEFAULT '00-00-00',
  `bank_Active` varchar(8) NOT NULL DEFAULT 'yes',
  PRIMARY KEY (`bank_Id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `banks`
--

LOCK TABLES `banks` WRITE;
/*!40000 ALTER TABLE `banks` DISABLE KEYS */;
INSERT INTO `banks` VALUES (1,'ne','asd','asdf','df','df','df','df','sdf','df','df','df','sdf','sdf','y');
/*!40000 ALTER TABLE `banks` ENABLE KEYS */;
UNLOCK TABLES;

最佳答案

这是我很久以前写的一个函数的一部分。
希望这有助于:

    private MySqlConnection NewConnection(string host, int port, string database, string user, string password)
    {
        if (port <= 0) port = 3306;
        string cstr = "";
        if (database == "")
            cstr = String.Format("SERVER={0};PORT={1};UID={2};PWD={3}",
                host, port, user, password);
        else
            cstr = String.Format("SERVER={0};PORT={1};DATABASE={2};UID={3};PWD={4}",
                host, port, database, user, password);
        MySqlConnection conn = new MySqlConnection(cstr);
        try { conn.Open(); }
        catch (Exception ex)
        {
            conn = null;
        }
        return conn;
    }

    public int ExecuteScript(MySqlConnection conn, string sql)
    {
        err = "";
        int totrows = -1;
        if (conn == null) return totrows;
        if (conn.State == System.Data.ConnectionState.Closed) conn.Open();
        MySqlCommand cmd = new MySqlCommand(sql, conn);
        try
        {
            totrows = cmd.ExecuteNonQuery();
            cmd = null;
            return totrows;
        }
        catch (Exception ex)
        {
            err = ex.Message;
            return 0;
        }
    }

public bool Restore(string dbHost, int dbPort, string dbUser, string dbPassword, string file)
{
    int toterr = 0;
    int totsql = 0;
    string msql = "";
    StreamReader rd = null;
    FileStream fs = null;       

    MySqlConnection conn = NewConnection(dbHost, dbPort, "", dbUser, dbPassword);
    if (conn == null) return false;
    int cur = 0;
    int rows = 0;

    fs = new FileStream(file, FileMode.Open);
    rd = new StreamReader(fs);
    while (rd.Peek() > 0)
    {
        string t = rd.ReadLine().Trim();
        if ((t == "") || (t.StartsWith("--"))) continue;
        msql += t;
        if (msql == ";") msql = "";
        if (msql.EndsWith(";"))
        {
            string s = msql.Remove(msql.Length - 1, 1).Trim();
            msql = "";
            try
            {
                rows = ExecuteScript(conn, s);
            }
            catch
            {
                toterr++;
                break;
            }
            finally
            {
                cur++;
            }
        }
    }
    rd.Close();
    rd = null;
    fs.Close();
    fs = null;

    conn.Close();
    conn = null;
    return true;
}

关于c# - 使用 mysql 和 c# 恢复功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7887669/

相关文章:

c# - 对 Linq Lambda 表达式的 SQL 查询 - 使用组条件连接同一个表

c# - 在 ASP.NET 中本地化动态绑定(bind) DropDownList

c# - WPF ListView 对列单击进行排序

mysql - mysql存储过程concat()长字符串

mysql - sql查询有助于对同时包含字符串和数字的字段进行排序

mysql - 在 MySQL 中连接多个匹配特定列值的表的最快方法是什么

c# - 找不到 Android 文本文件

c# - 如何在#if 语句中设置.NET Core 进行编译

c# - 定制服务员有什么实际用途吗?

c# - 列表与字典(哈希表)