2

我有一个 c# winforms 应用程序(.net 2 框架)。我需要从我的应用程序中备份数据库。我试图通过异步执行 SqlCommand 来做到这一点。代码无一例外地执行,但我没有在我的目的地获得 .bak 文件......

这是代码:

#region backup DB using T-SQL command

string connString = "Data Source=" + ConfigurationManager.AppSettings.Get("localhost_SQLEXPRESS") + ";Initial Catalog=" + db + ";UserID=" + ConfigurationManager.AppSettings.Get("user") + ";Password=" + ConfigurationManager.AppSettings.Get("password");
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connString);
builder.AsynchronousProcessing = true;
using (SqlConnection sqlConnection1 = new SqlConnection(builder.ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand("BACKUP DATABASE " + db + " TO DISK=" + location + "\\" + ConfigurationManager.AppSettings.Get("DataBaseBackupsFolderName") + "\\" + db + ".bak'", sqlConnection1))
    {    
        sqlConnection1.Open();    
        IAsyncResult result = cmd.BeginExecuteNonQuery();

        while (!result.IsCompleted)
        {
            Thread.Sleep(100);
        }
    }
}
#endregion
4

3 回答 3

3

在您的 SQL 备份行中,您似乎在备份文件路径的开头缺少一个单引号。

  using (SqlCommand cmd = new SqlCommand("BACKUP DATABASE " + db + " TO DISK='" + location + "\\" + ConfigurationManager.AppSettings.Get("DataBaseBackupsFolderName") + "\\" +db + ".bak'", sqlConnection1)) 
于 2012-07-04T10:14:04.507 回答
1

您应该调用EndExecuteNonQuery()SqlCommand 实例以引发任何最终异常,从而了解您的 SQL 语句有什么问题:

IAsyncResult result = cmd.BeginExecuteNonQuery();

// Wait for the command to complete

result.AsyncWaitHandle.WaitOne();

// End the execution and throw any eventual exception

cmd.EndExecuteNonQuery(result);

正如你所看到的,我还用更有效的等待命令的等待句柄替换了你原来的 Thread.Sleep() 循环块。

引用MSDN

对于对 BeginOperationName 的每次调用,应用程序还应调用 EndOperationName 以获取操作结果。

于 2012-07-04T10:11:32.490 回答
1

尝试隔离问题的两个建议:

1)获取结果字符串(您在 SqlCommand 上执行的字符串并在 SQL Server 上手动运行它以确保备份命令正确。

2) 尝试使用常规 ExecuteNonQuery 的同步命令,查看是否收到 SQL Server 异常

于 2012-07-04T10:15:53.867 回答