實現效果
- 本輔助類主要是 OSql命令操作函數(可用於安裝程序的時候數據庫腳本執行)。
- 本輔助類庫通常用在SqlServer數據庫腳本執行,附加、分離、備份、恢復數據庫等操作。
實現步驟
在代碼引用相關的代碼實現動態調用。
實現代碼
主要的類庫函數如下所示
/// <summary>
/// 本地執行SQL腳本
/// </summary>
/// <param name="path">腳本文件路徑全名</param>
public static void DoSQL(string path)
/// <summary>
/// 執行SQL腳本
/// </summary>
/// <param name="path">腳本文件路徑全名</param>
/// <param name="userID">數據庫登錄ID</param>
/// <param name="password">數據庫登錄密碼</param>
/// <param name="server">數據庫服務器地址</param>
public static void DoSQL(string path, string userID, string password, string server)
/// <summary>
/// 後臺執行DOS文件
/// </summary>
/// <param name="fileName">文件名(包含路徑)</param>
/// <param name="argument">運行參數</param>
/// <param name="hidden">是否隱藏窗口</param>
public static void RunDos(string fileName, string argument, bool hidden)
/// <summary>
/// 在運行腳本之前把腳本中的數據庫名稱替換成安裝界面輸入的數據庫名稱
/// </summary>
/// <param name="filePath">腳本文件名</param>
/// <param name="oldDBName">原有的數據庫名稱</param>
/// <param name="newDBName">新的數據庫名稱</param>
public static void ReplaceDBName(string filePath, string oldDBName, string newDBName)
/// <summary>
/// 附加SqlServer數據庫
/// </summary>
public bool AttachDB(string connectionString, string dataBaseName, string dataBase_MDF, string dataBase_LDF)
/// <summary>
/// 分離SqlServer數據庫
/// </summary>
public bool DetachDB(string connectionString, string dataBaseName)
/// <summary>
/// 還原數據庫
/// </summary>
public bool RestoreDataBase(string connectionString, string dataBaseName, string DataBaseOfBackupPath, string DataBaseOfBackupName)
/// <summary>
/// 備份SqlServer數據庫
/// </summary>
public bool BackupDataBase(string connectionString, string dataBaseName, string DataBaseOfBackupPath, string DataBaseOfBackupName)
安裝執行數據庫腳本的操作例子如下所示
string sqlFilePath = physicalRoot + "MyERP.sql";
SqlScriptHelper.ReplaceDBName(sqlFilePath, "Hotel_Database", EdnmsDb.Database);
if (!string.IsNullOrEmpty(EdnmsDb.UserId) && !string.IsNullOrEmpty(EdnmsDb.Password))
{
SqlScriptHelper.DoSQL(sqlFilePath, EdnmsDb.UserId, EdnmsDb.Password, EdnmsDb.Server);
}
else
{
SqlScriptHelper.DoSQL(sqlFilePath, EdnmsDb.Server);
}
附上源碼
/// <summary>
/// OSql命令操作函數(可用於安裝程序的時候數據庫腳本執行)
/// </summary>
public class SqlScriptHelper
{
#region OSql操作函數
/// <summary>
/// 本地執行SQL腳本
/// </summary>
/// <param name="path">腳本文件路徑全名</param>
public static void DoSQL(string path)
{
string arguments = String.Format(" -E -S (local) -i \"{0}\"", path);
RunDos("osql.exe", arguments, false);
}
/// <summary>
/// 執行SQL腳本
/// </summary>
/// <param name="path">腳本文件路徑全名</param>
/// <param name="userID">數據庫登錄ID</param>
/// <param name="password">數據庫登錄密碼</param>
/// <param name="server">數據庫服務器地址</param>
public static void DoSQL(string path, string userID, string password, string server)
{
// -U -P -S -i關鍵字區分大小寫
string arguments = String.Format(" -U {0} -P {1} -S {2} -i \"{3}\"", userID, password, server, path);
RunDos("osql.exe", arguments, false);
// if(File.Exists(path))
// {
// File.Delete(path);
// }
}
/// <summary>
/// 後臺執行DOS文件
/// </summary>
/// <param name="fileName">文件名(包含路徑)</param>
/// <param name="argument">運行參數</param>
/// <param name="hidden">是否隱藏窗口</param>
public static void RunDos(string fileName, string argument, bool hidden)
{
Process process = new Process();
process.EnableRaisingEvents = false;
process.StartInfo.FileName = string.Format("\"{0}\"", fileName);
process.StartInfo.Arguments = argument;
if (hidden)
{
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
}
else
{
process.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
}
process.Start();
process.WaitForExit();
}
/// <summary>
/// 運行指定DOS命令行
/// </summary>
/// <param name="cmd">命令</param>
/// <param name="arg">命令行參數</param>
/// <param name="comfirm">寫入命令行的確認信息</param>
/// <param name="showWindow">是否顯示窗口</param>
/// <returns></returns>
private static string ExecuteCMD(string cmd, string arg, string comfirm, bool showWindow)
{
Process p = new Process();
p.StartInfo.FileName = cmd;
p.StartInfo.Arguments = arg;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
// 是否顯示窗口
p.StartInfo.CreateNoWindow = !showWindow;
// 窗口狀態
if (showWindow)
{
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
}
else
{
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
}
p.Start();
if (comfirm != null)
p.StandardInput.WriteLine(comfirm);
string msg = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();
return msg;
}
/// <summary>
/// 在運行腳本之前把腳本中的數據庫名稱替換成安裝界面輸入的數據庫名稱
/// </summary>
/// <param name="filePath">腳本文件名</param>
/// <param name="oldDBName">原有的數據庫名稱</param>
/// <param name="newDBName">新的數據庫名稱</param>
public static void ReplaceDBName(string filePath, string oldDBName, string newDBName)
{
if (newDBName.CompareTo(oldDBName) != 0)
{
string fileText = string.Empty;
using (StreamReader streamReader = new StreamReader(filePath, Encoding.Default))
{
fileText = streamReader.ReadToEnd();
fileText = fileText.Replace(oldDBName, newDBName);
}
using (StreamWriter streamWriter = new StreamWriter(filePath, false, Encoding.Default))
{
streamWriter.Write(fileText);
}
}
}
/// <summary>
/// 爲測試使用的函數
/// </summary>
/// <param name="fileText">輸出的內容</param>
private static void WriteLog(string fileText)
{
string filePath = "C:\\Log.txt";
using (StreamWriter streamWriter = new StreamWriter(filePath, true, Encoding.Default))
{
streamWriter.Write(fileText);
}
}
/// <summary>
/// 加入安裝文件的路徑,方便Web端訪問
/// </summary>
public static void UpdatePathEnvironment(string physicalRoot)
{
//得到原來Path的變量值
string registerKey = "SYSTEM\\ControlSet001\\Control\\Session Manager\\Environment";
string key = "Path";
RegistryKey regKey = Registry.LocalMachine.OpenSubKey(registerKey);
string result = regKey.GetValue(key).ToString();
//添加新的值
if (result.IndexOf(physicalRoot) < 0)
{
result += string.Format(";{0}", physicalRoot);
}
regKey = Registry.LocalMachine.OpenSubKey(registerKey, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.SetValue);
regKey.SetValue(key, result);
}
#endregion
#region 附加、分離、備份、恢復數據庫操作
/// <summary>
/// 附加SqlServer數據庫
/// </summary>
public bool AttachDB(string connectionString, string dataBaseName, string dataBase_MDF, string dataBase_LDF)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "sp_attach_db";
comm.Parameters.Add(new SqlParameter("dbname", SqlDbType.NVarChar));
comm.Parameters["dbname"].Value = dataBaseName;
comm.Parameters.Add(new SqlParameter("filename1", SqlDbType.NVarChar));
comm.Parameters["filename1"].Value = dataBase_MDF;
comm.Parameters.Add(new SqlParameter("filename2", SqlDbType.NVarChar));
comm.Parameters["filename2"].Value = dataBase_LDF;
comm.CommandType = CommandType.StoredProcedure;
comm.ExecuteNonQuery();
}
return true;
}
/// <summary>
/// 分離SqlServer數據庫
/// </summary>
public bool DetachDB(string connectionString, string dataBaseName)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "sp_detach_db";
comm.Parameters.Add(new SqlParameter("dbname", SqlDbType.NVarChar));
comm.Parameters["dbname"].Value = dataBaseName;
comm.CommandType = CommandType.StoredProcedure;
comm.ExecuteNonQuery();
}
return true;
}
/// <summary>
/// 還原數據庫
/// </summary>
public bool RestoreDataBase(string connectionString, string dataBaseName, string DataBaseOfBackupPath, string DataBaseOfBackupName)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "use master;restore database @DataBaseName From disk = @BackupFile with replace;";
comm.Parameters.Add(new SqlParameter("DataBaseName", SqlDbType.NVarChar));
comm.Parameters["DataBaseName"].Value = dataBaseName;
comm.Parameters.Add(new SqlParameter("BackupFile", SqlDbType.NVarChar));
comm.Parameters["BackupFile"].Value = Path.Combine(DataBaseOfBackupPath, DataBaseOfBackupName);
comm.CommandType = CommandType.Text;
comm.ExecuteNonQuery();
}
return true;
}
/// <summary>
/// 備份SqlServer數據庫
/// </summary>
public bool BackupDataBase(string connectionString, string dataBaseName, string DataBaseOfBackupPath, string DataBaseOfBackupName)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "use master;backup database @dbname to disk = @backupname;";
comm.Parameters.Add(new SqlParameter("dbname", SqlDbType.NVarChar));
comm.Parameters["dbname"].Value = dataBaseName;
comm.Parameters.Add(new SqlParameter("backupname", SqlDbType.NVarChar));
comm.Parameters["backupname"].Value = Path.Combine(DataBaseOfBackupPath, DataBaseOfBackupName);
comm.CommandType = CommandType.Text;
comm.ExecuteNonQuery();
}
return true;
}
#endregion
}