从bak文件恢复数据库

时间:2018-03-15 20:10:35

标签: c# sql .net

我正在尝试从bak文件恢复数据库。我找到了一些关于如何用语法编写的代码,但我不确定我做错了什么。我收到了一个错误:

错误: 服务器'www.freegamedata.com'的恢复失败。

我认为因为我是远程连接的?我不确定。 bak文件不在服务器计算机上。我正在尝试构建一个桌面应用程序,它将使用我的文件在用户服务器上安装我的数据库。这是我的代码:

 private void Restore_Database()
    {
        try
        {
            Server server = new Server(Properties.Settings.Default.SQL_Server);
            string filename = "Test.bak";
            string filepath = System.IO.Directory.GetCurrentDirectory() + "\\file\\" + filename;
            Restore res = new Restore();

            res.Database = Properties.Settings.Default.SQL_Database;      
            res.Action = RestoreActionType.Database;
            res.Devices.AddDevice(filepath, DeviceType.File);
            res.PercentCompleteNotification = 10;
            res.ReplaceDatabase = true;
            res.PercentComplete += new PercentCompleteEventHandler(res_PercentComplete);  
            res.SqlRestore(server);
        }
        catch(Exception ex)
        {

        }
    }  

我不确定我是否以正确的方式解决这个问题。我想将我的数据库作为基础数据库添加到用户服务器。难道我做错了什么?我的连接字符串很好,所以我知道它不是连接问题。

2 个答案:

答案 0 :(得分:0)

还原文件必须在服务器上。对于安装,请使用SQL脚本。这可以由SQL Server Management Studio生成(包括数据)。

右键单击数据库。选择"任务" - "生成脚本"。在向导的第二页上选择" Advanced"并找到"脚本的数据类型"。选择"架构和数据"并将脚本保存到文件。

然后使用此代码在数据库上运行脚本

string scriptText = File.ReadAllText(scriptFile, Encoding.Default);
ExecuteBatch executeBatch = new ExecuteBatch();
StringCollection commandTexts = executeBatch.GetStatements(scriptText);

using (SqlConnection sqlConnection = new SqlConnection(conn))
{
    sqlConnection.InfoMessage += SqlConnection_InfoMessage;
    sqlConnection.Open();

    for (int i = 0; i < commandTexts.Count; i++)
    {
        try
        {
            log.InfoFormat("Executing statement {0}", i + 1);
            string commandText = commandTexts[i];

            using (SqlCommand sqlCommand = sqlConnection.CreateCommand())
            {
                log.Debug(commandText);
                sqlCommand.CommandText = commandText;
                sqlCommand.CommandTimeout = 300;
                int r = sqlCommand.ExecuteNonQuery();
                log.DebugFormat("{0} rows affected", r);
            }
        }
        catch (Exception ex)
        {
            log.Warn("Executing command failed", ex);

            try
            {
                sqlConnection.Open();
            }
            catch (Exception ex2)
            {
                log.Error("Cannot reopen connection", ex2);
            }
        }
    }

    sqlConnection.Close();
}

答案 1 :(得分:0)

我找到了一个没有本地访问权限的解决方法。这有点涉及,所以我希望我正确解释这一点,这是有道理的。

另请注意,在执行下面列出的步骤之前,您需要将数据导出到Excel电子表格。

导出数据 第1部分: 备份你的数据!

这是一个非常简单的过程。打开SQL Management Studio并右键单击您的数据库。选择导出数据并将其导出为ex​​cel电子表格2007.我不打算在此部分给出详细的步骤,因为它非常基本,你可以谷歌它。抱歉给你带来不便。

第2部分: 删除数据库以进行测试,但确保在删除数据库之前有可用的备份。

导入数据 第1部分: 您需要创建一个脚本,自动为您构建数据库。您可以通过登录SQL管理Studio并右键单击数据库并选择:

来完成此操作
  • 任务 - &gt;生成脚本

您应该只需要默认信息。但是,如果您喜欢我,我会排除列表中的用户。这将生成一个大型SQL脚本。

第2部分: 接下来,您需要将此文件存储在解决方案/项目中。确保右键单击它并选择始终复制或复制(如果较新)。我认为这是选择。基本上它只是在调试或构建文件时复制文件。这很关键,因为您需要访问此文件才能执行脚本。接下来,您需要创建一个类似于我的SQL函数来执行脚本:

public bool SQLScript_ExecuteSQLScript(string ScriptLocation)
        {
            try
            {
                //5 min timeout
                SqlConnection SQLConn = new SqlConnection(cn + "; Connection Timeout = 300;");
                string script = File.ReadAllText(ScriptLocation);
                Server server = new Server(new ServerConnection(SQLConn));

                server.ConnectionContext.ExecuteNonQuery(script);

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

在我的代码示例中请注意我将超时更改为5分钟。如果您有一个大脚本,您可能需要调整超时以确保您的脚本完全执行。

恭喜您重建了数据库。

第3部分: 加载SQL Management Studio并确保已成功重建数据库。您应该看到所有表和存储过程,但没有数据。如果这是真的,那么你可以继续。如果没有,请返回并查看您的脚本。如果脚本中有SQL注释,则可能需要将其删除。我必须为了让我的脚本无错误地执行。

第4部分: 现在,您需要从之前创建的Excel电子表格中导入数据。如果你喜欢我,你有多张床单。如果您有多页表格,那么您需要制作一个列表以循环列表中的每个项目以导入表格。如果没有,则可以忽略列表中的代码。我也将我的工作放在后台工作人员中,但您不需要依赖于数据的大小。另请注意,我创建了一个包含我的列表的单独类,但如果您不想要,则不必这样做。我的工作表名称是Table_1,Table_2和Table_3,您的可能性最大。

样本表列表:

public List<string> GetTestTableList()
        {
            try
            {
                List<string> testlist = new List<string>();
                testlist.Add("Table_1");
                testlist.Add("Table_2");
                testlist.Add("Table_3");

                return testlist;
            }
            catch (Exception ex)
            {
                return null;
            }
        }

第5部分: 接下来,我们将从excel导入数据到SQL。这是我所做的功能,但您可以修改它以满足您的需求。

功能:

private bool Import_Data_Into_SQL(string filepath, string SheetName, string Database, string Schema)
        {
            try
            {
                // sql table should match your sheet name in excel
                string sqltable = SheetName;

                // select all data from sheet by name  
                string exceldataquery = "select * from [" + SheetName + "$]";

                //create our connection strings - Excel 2007 - This may differ based on Excel spreadsheet used
                string excelconnectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" + filepath + " '; Extended Properties=Excel 8.0;";
                string sqlconnectionstring = Properties.Settings.Default.SQL_Connection;

                //series of commands to bulk copy data from the excel file into our sql table 
                OleDbConnection oledbconn = new OleDbConnection(excelconnectionstring);
                OleDbCommand oledbcmd = new OleDbCommand(exceldataquery, oledbconn);
                oledbconn.Open();
                OleDbDataReader dr = oledbcmd.ExecuteReader();
                SqlBulkCopy bulkcopy = new SqlBulkCopy(sqlconnectionstring);
                bulkcopy.DestinationTableName = Database + "." + Schema +"." + sqltable;

                while (dr.Read())
                {
                    bulkcopy.WriteToServer(dr);
                }

                dr.Close();
                oledbconn.Close();

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

我希望这会有所帮助。这是我的解决方案。最初我想/尝试使用.bak文件导入我的数据,但如上所述,只有当sql server是本地服务器时才能这样做。所以我希望这项工作可以帮助那些面临类似问题的人。我没有将此标记为答案,因为上面的帖子回答了问题,但我发布这个以防其他人需要这个解决方法。谢谢