我应该将ExecuteNonQuery用于此db backup命令吗?

时间:2011-03-10 22:47:34

标签: c# ado.net

我有一种方法可以让我开始备份数据库。我想知道的是,如果我在这个上下文中使用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();
        }
    }

我关注的一件事是能够验证备份是否完整且成功,同时处理备份的超时问题并延长完成时间。

8 个答案:

答案 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