Should I use ExecuteNonQuery for this db backup command

白昼怎懂夜的黑 提交于 2020-01-30 03:27:06

问题


I have a method that allows me to kick off a back up of a data base. What I am wondering is if I should be using ExecuteNonQuery() in this context or if there is something better to use. Here is my code currently:

    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();
        }
    }

The one thing I am concerned about is being able to verify that the backup is complete and successful while handling time out issues for backups that take and extended time to complete.


回答1:


ExecuteNonQuery means that the command doesn't return any data. It doesn't mean that it executes asynchronously or that you won't receive error information. It will block until the command finishes and return any errors that may occur




回答2:


To handle the issue of the long running query I ended up going with this:

    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();

        }

    }

This will allow me to execute the command without asyncronously without timeout issues. I will be adding some additional error handling etc in my final code set. I may do some additional work to see if I can get a better status returned at the end of the script that I can get via EndExecuteNonQuery or through an AsyncCallBack.




回答3:


ExecuteNonQuery() 

should be fine to use here. What I would do is run a try catch around the using to catch any errors that might happen and deal with them appropiately.




回答4:


You should use ExecuteNonQuery when you do not what to receive any information from the database as a result of your call. If any error with happen during execute of the command you will get a corresponding exception.




回答5:


This does look like the type of thing you should put in a stored procedure to do some error handling.

Also, have a look here to see it done in code.




回答6:


I think ExecuteNonQuery is fine, but You should consider to user a timeout with Your query.

objCommand.CommandTimeout = 60*60; // for an hour or more

If You're using a desktop application, then for sure You should execute this query within asynchronous call.




回答7:


ExecuteNonQuery is the correct command to use.

If you wish to receive more info about the restore process you should subscribe to the InfoMessage event of the SqlConnection object. That was you can capture all the "non-error" messages as well.




回答8:


Try it. it resolved timeout expired problem while large size db.

Private Sub Command1_Click() On Error Resume Next Dim con As New Connection Dim tm As String con.CommandTimeout = 500'''Command timeout should be 500

With con .ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=dbiBMS;Data Source=192.168.103.4" .Open End With tm = CStr(Time)

con.Execute " backup database dbiBMS to disk='E:\Database_Backup\Test1.bak' with format "

con.Close MsgBox tm Exit Sub x: MsgBox Err.Description

End Sub



来源:https://stackoverflow.com/questions/5266833/should-i-use-executenonquery-for-this-db-backup-command

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!