2009-02-16 70 views
4

在.NET應用程序中執行SQL Server腳本的推薦方法是什麼?爲什麼?從.NET應用程序執行SQL Server腳本的最佳做法?

我正在創建一個應用程序,我們可以從我們的安裝程序運行來處理升級我們的數據庫,當我們的應用程序的先前版本安裝。數據庫有一個版本表,我可以通過編程訪問並確定要升級哪些升級腳本來升級數據庫。將它嵌入到我們的安裝程序可以調用來執行升級的應用程序中是很有意義的。

我正在尋找如何最好地執行適當的升級腳本。搜索網頁我已經看到了使用「GO」語句分割腳本的建議,並使用了SqlCommand.ExecuteNonQuery()。我也看到了使用SQL Server Management Objects (SMO)的建議。

我正在尋找關於在.NET應用程序中執行這些腳本的各種方式的優缺點的建議。

回答

1

最好的方法是符合所有功能和非功能限制的任何方法。

什麼樣的速度你需要,有沒有結合當前形勢 任何問題,什麼是您的備份/故障策略

我可能會使用SqlCommand.ExecuteNonQuery(),因爲它在.NET的一部分運行時,不需要額外安裝用戶可能不需要的應用程序。

從你的問題我假設有一個現有的應用程序與大量的嵌入式查詢字符串。我會嘗試進入某種自動將它們放置在服務器上(作爲存儲過程)和代碼中的存儲庫。

不要害怕使用查詢的簡單文本文件或其他配置文件。

+0

我傾向於SqlCommand.ExecuteNonQuery()。我們在數據庫中有一個版本表,並且會定義腳本以在版本之間升級,這些版本都將在源代碼控制之下。這個應用程序有一個本土ORM,我專門爲應用程序的安裝程序工作。 – 2009-02-17 17:34:52

1

我有一致的結果使用System.Diagnostics.Process並調用到OSQL.exe。它爲一個SQL文件....

我創建了一個臨時文件,我寫我的嵌入式SQL文件,有OSQL執行它,然後清理它。

process.StartInfo = new System.Diagnostics.ProcessStartInfo(); 
    process.StartInfo.FileName = OSQLpath; 
    process.StartInfo.UseShellExecute = false; 
    ... 
    if (!System.IO.Directory.Exists(workingDirectory)) 
         System.IO.Directory.CreateDirectory(workingDirectory); 
    ... 
    StringBuilder sbArgs = new StringBuilder(); 

    sbArgs.Append("-S ").Append(_serverName); 
    sbArgs.Append(" -d ").Append(_databaseName); 
    sbArgs.Append(" -E"); 
    sbArgs.Append(" -i ").Append("\"").Append(inputSQLFilePath).Append("\""); // input file 
    sbArgs.Append(" -o ").Append("\"").Append(System.IO.Path.Combine(workingDirectory, String.Format("osqloutput_{1}_{0}.txt", fileUnique, fileName))).Append("\""); // output file 

    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.RedirectStandardError = true; 

    process.StartInfo.Arguments = sbArgs.ToString(); 
    process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
    process.StartInfo.CreateNoWindow = true; 

... 

    System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor; 
    process.Start(); 
    process.WaitForExit(); 
+0

這種技術存在問題,因爲您必須從外部可執行文件解析I/O。使用.NET API是最有意義的。 – 2009-02-17 19:58:09

2

雖然它可能不是特別滿足您的需求從.NET應用程序中運行,sqlcmd非常適合(和設計)這個過程。通過執行能力解析&運行SQL腳本,您正在複製工具功能。 sqlcmd可在standalone installer中獲得,可與您的應用程序捆綁在一起。

如果您選擇使用鏈接的SqlCommand.ExecuteNonQuery()解決方案,那麼大型腳本將腳本讀取到搜索「GO」語句的較小緩衝區中的內存效率會更高,一旦」。

相關問題