我有一种方法可以让我开始备份数据库。我想知道的是,如果我在这个上下文中使用ExecuteNonQuery(),或者有更好的东西可以使用。这是我目前的代码:
public static void RunBackup(string dbName, string filePath, string backupName, string connString)
{
using(SqlConnection objConnection = new SqlConnection(connString))
{
string commmandText = "BACKUP DATABASE @DBName TO DISK = @FilePath WITH NOFORMAT, NOINIT, NAME = @BackUpName, SKIP, NOREWIND, NOUNLOAD, STATS = 10";
SqlCommand objCommand = new SqlCommand(commmandText,objConnection);
objCommand.Parameters.AddWithValue("@dbName", dbName);
objCommand.Parameters.AddWithValue("@FilePath", filePath);
objCommand.Parameters.AddWithValue("@BackUpName", backupName);
objConnection.Open();
objCommand.ExecuteNonQuery();
objConnection.Close();
}
}
我关注的一件事是能够验证备份是否完整且成功,同时处理备份的超时问题并延长完成时间。
答案 0 :(得分:3)
ExecuteNonQuery表示该命令不返回任何数据。这并不意味着它以异步方式执行或者您不会收到错误信息。它将阻塞,直到命令完成并返回可能发生的任何错误
答案 1 :(得分:1)
ExecuteNonQuery()
在这里使用应该没问题。我要做的是运行try catch来捕获可能发生的任何错误并适当地处理它们。
答案 2 :(得分:1)
为了处理长时间运行的查询问题,我最终得到了这个:
public static void RunBackup(string dbName, string filePath, string backupName, string connString)
{
string commmandText = "BACKUP DATABASE @DBName TO DISK = @FilePath WITH NOFORMAT, NOINIT, NAME = @BackUpName, SKIP, NOREWIND, NOUNLOAD, STATS = 10";
SqlConnection objConnection = new SqlConnection(connString);
try
{
SqlCommand objCommand = new SqlCommand(commmandText, objConnection);
objCommand.Parameters.AddWithValue("@dbName", dbName);
objCommand.Parameters.AddWithValue("@FilePath", filePath);
objCommand.Parameters.AddWithValue("@BackUpName", backupName);
objConnection.Open();
IAsyncResult result = objCommand.BeginExecuteNonQuery();
while (!result.IsCompleted)
{
System.Threading.Thread.Sleep(100);
}
int count = objCommand.EndExecuteNonQuery(result);
}
catch (SqlException e)
{
throw e;
}
finally
{
objConnection.Close();
}
}
这将允许我在没有异常的情况下执行命令而不会出现超时问题。我将在最终的代码集中添加一些额外的错误处理等。我可以做一些额外的工作,看看我是否可以在脚本结束时返回更好的状态,我可以通过EndExecuteNonQuery或通过AsyncCallBack获得。
答案 3 :(得分:0)
如果您因为通话而无法从数据库接收任何信息,则应使用ExecuteNonQuery
。如果在执行命令期间发生任何错误,您将收到相应的异常。
答案 4 :(得分:0)
这看起来像是应该放在存储过程中进行错误处理的类型。
另外,看看here,看看它是否在代码中完成。
答案 5 :(得分:0)
我认为ExecuteNonQuery很好,但你应该考虑使用你的查询来超时。
objCommand.CommandTimeout = 60 * 60; //一小时或更长时间
如果您使用的是桌面应用程序,那么请确保您应该在异步调用中执行此查询。
答案 6 :(得分:0)
ExecuteNonQuery
是正确使用的命令。
如果您希望收到有关还原过程的更多信息,则应订阅SqlConnection对象的InfoMessage
事件。那就是你可以捕获所有“非错误”消息。
答案 7 :(得分:0)
试试吧。它在大尺寸数据库时解决了超时过期问题。
Private Sub Command1_Click() On Error Resume Next Dim con作为新连接 Dim tm As String con.CommandTimeout = 500'''命令超时应为500
与con .ConnectionString =" Provider = SQLOLEDB.1; Persist Security Info = False; User ID = sa; Initial Catalog = dbiBMS; Data Source = 192.168.103.4" 。打开 结束 tm = CStr(时间)
con.Execute"备份数据库dbiBMS到磁盘=' E:\ Database_Backup \ Test1.bak'格式为"
con.Close MsgBox tm 退出子 X: MsgBox Err.Description
End Sub