最近在寫帳套工具,寫一些總結和體會。
1) 註冊DLL,OCX
最簡單的方法,直接使用Process.Start(cmd路徑)來執行註冊,其中cmd爲可參考爲以下
regsvr32 "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqldmo.dll"
@echo off
echo 註冊成功,謝謝您的使用!
Pause
2)複製文件夾路徑
複製文件很簡單,可是直接複製文件夾呢,就稍微麻煩些,由於畢竟微軟沒提供這樣的API,因此只能本身寫
參考了下網上有人提供的源代碼,再稍微修改了下,其實思路很簡單,就是用遞歸的方式,一層一層的複製,直到最後一層
private void CopyDirectory(string srcdir, string desdir)
{
string folderName = srcdir.Substring(srcdir.LastIndexOf("\\") + 1);
string desfolderdir = desdir + "\\" + folderName;
if (desdir.LastIndexOf("\\") == (desdir.Length - 1))
{
desfolderdir = desdir + folderName;
}
string[] filenames =
Directory.GetFileSystemEntries(srcdir);
foreach (string file in filenames) // 遍歷全部的文件和目錄
{
if (Directory.Exists(file))// 先看成目錄處理若是存在這個目錄就遞歸Copy該目錄下面的文件
{
string currentdir = desfolderdir + "\\" + file.Substring(file.LastIndexOf("\\") + 1);
if (!Directory.Exists(currentdir))
{
Directory.CreateDirectory(currentdir);
}
CopyDirectory(file, desfolderdir);
}
else // 不然直接copy文件
{
string srcfileName = file.Substring(file.LastIndexOf("\\") + 1);
srcfileName = desfolderdir + "\\" + srcfileName;
if (!Directory.Exists(desfolderdir)) //已存在就不建立
{
Directory.CreateDirectory(desfolderdir);
}
File.Copy(file, srcfileName, true); //覆蓋
}
}
}
3) 數據庫備份,還原
方法1:利用SQLDMO方式,缺點是須要註冊,SQLSERVER默認安裝並不支持這個,註冊可參考文件說明:
代碼可參考:
//備份
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(".", "sa", "a1~");//服務器名、帳號、密碼
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = "b22";
oBackup.Files = "[" + @"C:\123.bak" + "]";
oBackup.BackupSetName = "b22";
oBackup.BackupSetDescription = "數據庫備份";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
}
catch
{
throw;
}
finally
{
oSQLServer.DisConnect();
}
//還原
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(".", "sa", "a1~");
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = "b22_bb";
oRestore.Files = @"D:\temp\123.bak";
oRestore.RelocateFiles = "fzdrp," +
@"[D:\temp\123.mdf]," +
"fzdrp_log," +
@"[D:\temp\123.ldf],";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = true;
oRestore.SQLRestore(oSQLServer);
}
catch
{
throw;
}
finally
{
oSQLServer.DisConnect();
}
優勢:比較對象化,方便,缺點非本機備份還原,相對麻煩(我也沒研究過非本機的,因客戶要求,只是在數據庫服務器上操做)
方法2:利用SQLSERVER本身的SQL命令,也算比較簡單,有一些附加命令可用,如下列出最簡單的DEMO
--備份
backup database test to disk='d:\temp\b22.bak'
--恢復
use master
go
ALTER DATABASE B22 SET OFFLINE --目的是殺掉其餘鏈接,強制脫機
restore database b22 from disk='d:\temp\b22.bak'
4) 升級數據庫
方法一:這個是最折騰人的,我當時利用process來啓動osql.exe進程來執行。在網上找了不少資料,大概調用以下:
Process osqlProcess = new Process();
osqlProcess.StartInfo.FileName = "osql.exe";
string sqlpath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"updatesql.sql") ;
osqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -S {2} -d {3} -i {4} -b", "sa", "a1~", "LJUN", "b22", sqlpath);
osqlProcess.StartInfo.UseShellExecute = false;
osqlProcess.StartInfo.RedirectStandardOutput = true; //重定向輸出
osqlProcess.StartInfo.CreateNoWindow = true;
osqlProcess.Start(); //執行輸出
//osqlProcess.StandardOutput.ReadToEnd(); //加上後若在小文件執行時,發生錯誤沒有輸出值;沒有則在大文件執行時卻會被中止,加與不加根據實際狀況考慮
osqlProcess.WaitForExit();
int code = osqlProcess.ExitCode;
StreamReader sr = osqlProcess.StandardOutput;
//升級失敗
if (code != 0)
{
MessageBox.Show("腳本執行失敗,關閉後可查看日誌瞭解詳情!");
string strMsg = sr.ReadToEnd();
string filepath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"err.txt");
StreamWriter sw = new StreamWriter(filepath);
sw.Write(strMsg);
sw.Flush();
sw.Close();
sw.Dispose();
Process.Start(filepath);
}
else {
MessageBox.Show("執行成功!");
}
osqlProcess.Close();
sr.Close();
sr.Dispose();
方法二: 直接將上面的osql.exe 替換成sqlcmd.exe,由於調用同樣,因此其餘不變,經測試,並不出現上述的問題,看來問題完美解決,而後又查了一些資料,關於osql.exe,sqlcmd.exe,還有isql.exe,得出結論
這3個工具使用了不一樣的SQL鏈接部件,
sqlcmd用在sql 2005或更高版本,由於性能更好;osql 主要用於sql 7.0和sql 2000;isql主要用於sql 6.5及更早的版本!因此當可使用sqlcmd時,優先選擇這個
5) 重啓SQL服務
方法1: 寫入一個cmd文件來重啓,用Process.Start來調用,cmd文件命令以下
net stop mssqlserver
net start mssqlserver
@echo off
echo 重啓服務成功!
Pause
方法2: C#代碼,直接來對MSSQLSERVER的服務進行入手,先中止,再啓用服務
ServiceController sc = new ServiceController("MSSQLSERVER"); //重啓A-B服務
sc.Stop();
sc.WaitForStatus(ServiceControllerStatus.Stopped);
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running);
sc.Close();
sc.Dispose();
6) 禁用IIS服務
一樣也有如上兩種方式,不過第1種我沒試成功,win7下好像不行,win2003是能夠的!第2種比較好
方法1:直接關閉iisadmin服務
ServiceController sc = new ServiceController("iisadmin");
sc.Stop();
sc.WaitForStatus(ServiceControllerStatus.Stopped);
方法2:利用進程啓動cmd方式
Process cmdProcess = new Process();
cmdProcess.StartInfo.FileName = "cmd.exe";
cmdProcess.StartInfo.Arguments = "net stop w3svc";
cmdProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmdProcess.Start();
cmdProcess.WaitForExit();
cmdProcess.Close();
-------------------------------------------------華麗的分割線---------------------------------------------------------------------------
隨筆記錄,LZ比較懶,你們湊合看看,格式就懶得調了,原創文章,轉載請註明.....
----------------------------------------------------------------------------------------------------------------------------------------