来自C#的备份数据库

时间:2014-07-25 09:13:59

标签: c# sql .net sql-server

我有一个存储过程在使用Windows身份验证时运行时工作正常。如果我作为标准网站用户运行它失败了,我猜这是权限的事情。所以我正在尝试添加一个脚本,允许我从C#连接到数据库并使用Windows身份验证运行备份。

public bool BackUpDataBase()
{
    string connString = _country == Country.England ? _connectionStringSiteDbEngland : _connectionStringSiteDbScotland;

    try
    {
            using (SqlConnection conn = new SqlConnection(connString)) 
            {
                conn.Open();
                SqlCommand cmd  = new SqlCommand("BackupDB", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@BaseLocation", _serverBackupLocation));
                cmd.Parameters.Add(new SqlParameter("@BackupType", _backupType));
                cmd.ExecuteNonQuery();
                return true;
            }
    } 
    catch (Exception e)
    {
        //FAILED :(
        return false;
    }
}

我在cmd.ExecuteNonQuery();上收到超时错误。相同的连接字符串允许我连接数据库以在此查询表。

public bool IsScheduled()
{
        string archiveDB = _country == Country.England ? _englandArchiveDBName : _scotlandArchiveDBName;

        using (SqlConnection conn = new SqlConnection(_country == Country.England ? _connectionStringSiteDbEngland : _connectionStringSiteDbScotland)) 
        {
            conn.Open();
            SqlCommand cmd  = new SqlCommand(SQLToCheckSchedule(), conn);
            cmd.CommandType = CommandType.Text;

            int rows = 0;

            using (SqlDataReader rdr = cmd.ExecuteReader()) 
            {
               while (rdr.Read())
               {
                    rows++;
               }
            }  

            conn.Close();

            return rows > 0;
        }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

与常规表查询相比,您的数据库备份过程只需要太长时间。您可以通过SqlCommand.CommandTimeout属性

设置命令超时
cmd.CommandTimeout = 1000; //This is in seconds
cmd.ExecuteNonQuery();

默认值为30秒。您也可以将其设置为0,以便它可以无限期地等待。但是,这有点危险,因为这可能会锁定您的网站/应用程序。您可能希望将备份过程设置在其他位置,例如计划任务。