2011-10-05 5 views
6

SQL Server Management Studioでスクリプトを実行すると、メッセージウィンドウに表示されるメッセージが生成されることがよくあります。たとえば、データベースのバックアップを実行する場合:C#SQL Serverメッセージ出力のハンドル

処理済み。

処理された20%。

等...データベースの

加工1722608ページ 'サンプル'、ファイル 'SAMPE' ファイル1.

100に処理パーセント。

は、データベースの1ページファイルの 'サンプル'、ファイル 'Sample_Log' 1

に成功202.985 秒(66.299メガバイト/秒)で1722609ページを処理したBACKUP DATABASEを加工します。

これらのメッセージをデータベースに対してSQLスクリプトを実行しているC#アプリケーションに表示したいと考えています。しかし、SQLから生成されたメッセージ出力をどのように処理するかを理解することはできません。誰もこれを行う方法を知っていますか?どの接続フレームワークを使用しなければならないかは、私には関係ありません。私はLINQ、NHibernate、Entity Framework、ADO.Net、Enterprise Libraryに比較的慣れており、新しいものを学ぶことができて嬉しいです。

答えて

2

SqlConnection.InfoMessageイベントは、SQL Serverが警告メッセージまたは情報メッセージを返すときに発生します。 This websiteは可能な実装を示しています。

6

私が試したコード例は以下のとおりです。あなたが必要とするコードは実際にはこの部分です http://www.dotnetcurry.com/ShowArticle.aspx?ID=344

注:

cn.Open(); 
cn.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e) 
{          
     txtMessages.Text += "\n" + e.Message;         
}; 

それはe.Messageは(あなたがテキストボックスやラベルとして置き換えることができます)txtMessagesに戻ってメッセージを返し続けます。

また、この記事を参照してください可能性があります Backup SQL Server Database with progress

私のコードの例は次のようにあります。

//The idea of the following code is to display the progress on a progressbar using the value returning from the SQL Server message. 
//When done, it will show the final message on the textbox. 
String connectionString = "Data Source=server;Integrated Security=SSPI;"; 
SqlConnection sqlConnection = new SqlConnection(connectionString); 

public void DatabaseWork(SqlConnection con) 
{ 
    con.FireInfoMessageEventOnUserErrors = true; 
    //con.InfoMessage += OnInfoMessage; 
    con.Open(); 
    con.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e) 
    { 
     //Use textBox due to textBox has Invoke function. You can also utilize other way. 
     this.textBox.Invoke(
      (MethodInvoker)delegate() 
      { 
       int num1; 
       //Get the message from e.Message index 0 to the length of first ' ' 
       bool res = int.TryParse(e.Message.Substring(0, e.Message.IndexOf(' ')), out num1); 

       //If the substring can convert to integer 
       if (res) 
       { 
        //keep updating progressbar 
        this.progressBar.Value = int.Parse(e.Message.Substring(0, e.Message.IndexOf(' '))); 
       } 
       else 
       { 
        //Check status from message 
        int succ; 
        succ = textBox.Text.IndexOf("successfully"); 
        //or succ = e.Message.IndexOf("successfully"); //get result from e.Message directly 
        if (succ != -1) //If IndexOf find nothing, it will return -1 
        { 
         progressBar.Value = 100; 
         MessageBox.Show("Done!"); 
        } 
        else 
        { 
         progressBar.Value = 0; 
         MessageBox.Show("Error, backup failed!"); 
        } 
       } 
      } 
     ); 
    }; 
    using (var cmd = new SqlCommand(string.Format(
     "Your SQL Script"//, 
     //QuoteIdentifier(databaseName), 
     //QuoteString(Filename)//, 
     //QuoteString(backupDescription), 
     //QuoteString(backupName) 
     ), con)) 
    { 
     //Set timeout = 1200 seconds (equal 20 minutes, you can set smaller value for shoter time out. 
     cmd.CommandTimeout = 1200; 
     cmd.ExecuteNonQuery(); 
    } 
    con.Close(); 
    //con.InfoMessage -= OnInfoMessage; 
    con.FireInfoMessageEventOnUserErrors = false; 
} 

プログレスバーの作業を取得するためには、あなたがこれを実装する必要がありますあなたのアプリケーションがフリーズせず、突然100%完了することを可能にするbackgroundworker。