我正在尝试从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)
{
}
}
我不确定我是否以正确的方式解决这个问题。我想将我的数据库作为基础数据库添加到用户服务器。难道我做错了什么?我的连接字符串很好,所以我知道它不是连接问题。
答案 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并右键单击您的数据库。选择导出数据并将其导出为excel电子表格2007.我不打算在此部分给出详细的步骤,因为它非常基本,你可以谷歌它。抱歉给你带来不便。
第2部分: 删除数据库以进行测试,但确保在删除数据库之前有可用的备份。
导入数据 第1部分: 您需要创建一个脚本,自动为您构建数据库。您可以通过登录SQL管理Studio并右键单击数据库并选择:
来完成此操作您应该只需要默认信息。但是,如果您喜欢我,我会排除列表中的用户。这将生成一个大型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是本地服务器时才能这样做。所以我希望这项工作可以帮助那些面临类似问题的人。我没有将此标记为答案,因为上面的帖子回答了问题,但我发布这个以防其他人需要这个解决方法。谢谢