2010-12-03 13 views
1

私のC#アプリケーションのファイルにあるSQLスクリプトを実行する必要があります。 問題は、異なるデータベースにコマンドを実行するオブジェクトを作成することです。スクリプトでC#SQL Serverスクリプトのデータベース変更の問題

、私は現在のデータベースを変更する必要があるたびに、それは

USE [databasename]

コマンドを使用し、多くのオブジェクトの作品があるので、それはコマンドGOに多くの時間を使用していますので、私は読んでそのファイルは私がGOコマンドを見つけてデータベース内の文を実行するまで続きます。これまでのところ良いですが、コマンドの実行後、接続は最後の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()); 
    } 

これをacomplishする任意のエレガントかつ簡単な方法があります(それは私がプロファイラで何を得るのです)、それはそれぞれのExecuteNonQueryコマンドの実行sp_reset_conection後に接続をクリアしているようですか?

おかげ

+0

これは 'Enterprise-Library'とは何が関係していますか? –

+0

私はエンタープライズライブラリのデータベースオブジェクトを使用してスクリプトを実行します – DkAngelito

答えて

2

テストハーネスと自身のブログ上の結果とgood investigation by Joshua Flanaganがあります。あたかもあなたが描いているのと同じような問題を抱えているかのように読まれます。

これを行うには2通りの方法があります。いずれの方法が最適で、どのノックオン効果があるかを評価する必要があります。

  1. 明示的にデータベース接続を開いて閉じます。したがって、SqlDatabaseでデータベースを開くだけでなく、SqlConnectionを作成し、Open()と呼ぶ必要があります。
  2. 接続文字列にConnection Reset=Falseを単に追加してください。しかし、私はこのアプローチの賛否両論を知らないので、接続プールを無効にすることができると理解しているので、これの副作用があるかどうかはわかりません。あなたはあなたのアプリケーション/ユーティリティの文脈の中で私が望むよりもよく分かるでしょう。

私はすべての悪質な詳細については、を読むことをお勧めします。次に、あなたのために最適なものを見つけるために少し掘り下げてください。

2

USE [データベース]を解析して保存します。その後、すべての新しいクエリー文字列の先頭に、それをすべてまとめて追加します。回線が使用[データベース名]であれば、それはuseDBにそれを置くと、あなたのtxbuilder変数に追加していないこと

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()); 
     } 

お知らせ:そうが好き。したがって、txbuilderを "いっぱいにする"たびに、useDBとそれを一緒にstrQueryに追加し、クエリを実行します。各クエリは「USE [databasename]」で始まります...

また、新しいUSEをヒットするたびに、そのデータベースを使用するように切り替わります。

関連する問題