2011-10-05 11 views
6

SQL सर्वर प्रबंधन स्टूडियो में स्क्रिप्ट निष्पादित करते समय, संदेशों को अक्सर संदेश विंडो में प्रदर्शित किया जाता है। उदाहरण के लिए जब डेटाबेस का बैकअप चलाते हैं:सी # SQL सर्वर संदेश आउटपुट पर हैंडल

10 प्रतिशत संसाधित।

20 प्रतिशत संसाधित।

आदि ...

फ़ाइल पर डेटाबेस 'नमूना', फ़ाइल 'Sampe' के लिए 1,722,608 पृष्ठों प्रसंस्कृत 1.

100 प्रतिशत पूरा कर दिया।

प्रसंस्कृत 1 फ़ाइल पर डेटाबेस 'नमूना', फ़ाइल 'Sample_Log' के लिए पृष्ठों 1.

बैकअप डेटाबेस सफलतापूर्वक 202.985 सेकंड (66.299 MB/से) में 1,722,609 पृष्ठों संसाधित।

मैं इन संदेशों को एक सी # अनुप्रयोग में प्रदर्शित करने में सक्षम होना चाहता हूं जो डेटाबेस के विरुद्ध SQL स्क्रिप्ट चला रहा है। हालांकि, मैं यह नहीं समझ सकता कि SQL उत्पन्न होने पर संदेश आउटपुट पर हैंडल कैसे प्राप्त किया जाए। क्या किसी को भी पता है की यह कैसे किया जाता है? इससे कोई फर्क नहीं पड़ता कि मुझे किस कनेक्शन फ्रेमवर्क का उपयोग करना है। मैं LINQ, NHibernate, Entity Framework, ADO.Net, एंटरप्राइज़ लाइब्रेरी के साथ अपेक्षाकृत आरामदायक हूं, और नए सीखने में मुझे खुशी है।

उत्तर

2

SqlConnection.InfoMessage ईवेंट तब होता है जब SQL सर्वर चेतावनी या सूचनात्मक संदेश देता है। 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% पूरा हो जाएगा।

संबंधित मुद्दे