帳套工具的總結

最近在寫帳套工具,寫一些總結和體會。
 
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();
 
最扯蛋的就是中間註釋成紅色的這段,加上後若在小文件執行時,發生錯誤沒有輸出值;如不加則在大文件執行時卻會被中止,進程處於死鎖狀態。查了不少資料,才發現這篇文章,給你們分享:  http://www.cnblogs.com/angus332770349/archive/2012/06/15/2550247.html ,看來加與不加根據實際狀況考慮。
 
方法二: 直接將上面的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比較懶,你們湊合看看,格式就懶得調了,原創文章,轉載請註明.....
 
----------------------------------------------------------------------------------------------------------------------------------------
相關文章
相關標籤/搜索