2010-12-03 82 views
1

我需要從我的c#應用程序運行一個文件中的sql腳本。 問題是它在不同的數據庫上創建一個執行命令的對象。C#SQL Server腳本更改數據庫問題

在腳本,每次我需要改變它使用的命令

USE [databasename]

,並因爲有許多對象創建它使用命令GO了很多次了當前數據庫的時間,所以我讀該文件,直到我找到一個GO命令並在數據庫中運行該句子;到目前爲止這麼好,但是在命令運行之後,連接返回到默認數據庫(在這種情況下是master),忽略最後一個USE語句。

這是我用來讀取文件並執行腳本的代碼。

using (StreamReader reader = new StreamReader(databaseScriptFile)) 
    { 
     DatabaseFactory.CreateDatabase() 
     Database db = new SqlDatabase(connectionstring); 
     txbuilder = new StringBuilder(); 
     bool lastExecute = true;    
     while (!reader.EndOfStream) 
     { 
      text = reader.ReadLine(); 
      if (text.Trim().ToUpper() != "GO") 
      { 
       lastExecute = false; 
       txbuilder.AppendLine(text); 
      } 
      else 
      { 
       lastExecute = true; 
       db.ExecuteNonQuery(CommandType.Text, txbuilder.ToString()); 
       txbuilder.Length = 0; 
      } 
     } 
     //Make sure that the last sentence is executed 
     if (!lastExecute) 
      db.ExecuteNonQuery(CommandType.Text, txbuilder.ToString()); 
    } 

看來,它會清除各的ExecuteNonQuery命令執行後sp_reset_conection的連接(這是我在探查獲得)

是否有acomplish這個任何優雅和簡單的方法?

感謝

+0

這與'Enterprise-Library'有什麼關係? – 2010-12-03 23:59:43

回答

2

有與測試工具,並在自己的博客結果good investigation by Joshua Flanagan。它看起來好像他遇到了類似的問題。

有兩種方法可以做到這一點,您必須評估哪種方法最適合您,以及是否有任何連鎖效應。

  1. 明確地打開和關閉數據庫連接。因此,您不必僅僅使用SqlDatabase打開數據庫,您需要創建一個SqlConnection並在其上調用Open()
  2. 只需將Connection Reset=False添加到您的連接字符串。我不知道這種方法的優缺點,所以不知道是否有任何副作用,因爲我知道這可以禁用連接池。在應用程序/實用程序的環境中,你會比我更瞭解。

我建議閱讀the blog article瞭解所有的血淋淋的細節,然後做一點點的挖掘,看看哪些是最適合你的。

2

我會說解析出USE [數據庫]並存儲它。然後將它添加到每個新的查詢字符串的開頭,一旦它們全部放在一起。像這樣:

using (StreamReader reader = new StreamReader(databaseScriptFile)) 
     { 
      DatabaseFactory.CreateDatabase(); 
      Database db = new SqlDatabase(connectionstring); 
      txbuilder = new StringBuilder(); 
      bool lastExecute = true; 
      string useDB = ""; 
      while (!reader.EndOfStream) 
      { 
       text = reader.ReadLine(); 
       if (text.Substring(0, 3) == "USE") 
       { 
        useDB = text; 
       } 
       else if (text.Trim().ToUpper() != "GO") 
       { 
        lastExecute = false; 
        txbuilder.AppendLine(text); 
       } 
       else 
       { 
        lastExecute = true; 
        strQuery = useDB + txbuilder.ToString(); 
        db.ExecuteNonQuery(CommandType.Text, strQuery); 
        txbuilder.Length = 0; 
       } 
      } 
      //Make sure that the last sentence is executed 
      if (!lastExecute) 
       db.ExecuteNonQuery(CommandType.Text, txbuilder.ToString()); 
     } 

注意,如果該行是一個USE [數據庫名稱],它把它在useDB,並沒有將它添加到您的txbuilder變量。所以,每次你填充txbuilder時,你都會將useDB和它一起附加到strQuery中,然後運行查詢。然後每個查詢以「USE [databasename]」開頭......

此外,每當您點擊一個新的USE時,它都會切換到使用該數據庫。