2012-05-30 60 views
4

我想覈實一下我在C#中使用剛剛完成的備份針對SQL Server命令快速如何從Sql Server系統消息獲取返回值?

string _commandText = string.Format("RESTORE VERIFYONLY FROM DISK = '{0}'", backupLocation); 

SqlDataReader _sqlDataReader = SqlHelper.ExecuteReader("BookssortedSQLDbConnection", CommandType.Text, _commandText); 

如果我在SSMS執行命令返回「備份文件上1有效設置。」但是我怎樣才能把這個消息回傳到我的代碼中呢?

閱讀器不會工作,因爲沒有行被返回。

注意:我已嘗試SMO.Restore對象來嘗試並驗證它,但它不起作用,這就是爲什麼我這樣做。

_restore.SqlVerify(srv, out _errorMessage); //returns false even though bakcup is fine 

BTW - 開放的建議,因爲我不認爲這是實現什麼,我試圖做

回答

14

參考消息(嚴重性低於10),並打印輸出結果返回給客戶端,並通過SqlConnection實例作爲InfoMessage事件引發。每個事件包含一個SqlError對象的集合(這與SqlException.Errors中使用的類相同)。

下面是一個完整的示例,顯示連接狀態更改,信息消息和異常。請注意,我使用ExecuteReader而不是ExecuteNonQuery,但信息和異常結果相同。

namespace Test 
{ 
    using System; 
    using System.Data; 
    using System.Data.SqlClient; 

    public class Program 
    { 
     public static int Main(string[] args) 
     { 
      if (args.Length != 2) 
      { 
       Usage(); 
       return 1; 
      } 

      var conn = args[0]; 
      var sqlText = args[1]; 
      ShowSqlErrorsAndInfo(conn, sqlText); 

      return 0; 
     } 

     private static void Usage() 
     { 
      Console.WriteLine("Usage: sqlServerConnectionString sqlCommand"); 
      Console.WriteLine(""); 
      Console.WriteLine(" example: \"Data Source=.;Integrated Security=true\" \"DBCC CHECKDB\""); 
     } 

     public static void ShowSqlErrorsAndInfo(string connectionString, string query) 
     { 
      using (SqlConnection connection = new SqlConnection(connectionString)) 
      { 
       connection.StateChange += OnStateChange; 
       connection.InfoMessage += OnInfoMessage; 

       SqlCommand command = new SqlCommand(query, connection); 
       try 
       { 
        command.Connection.Open(); 
        Console.WriteLine("Command execution starting."); 
        SqlDataReader dr = command.ExecuteReader(); 
        if (dr.HasRows) 
        { 
         Console.WriteLine("Rows returned."); 
         while (dr.Read()) 
         { 
          for (int idx = 0; idx < dr.FieldCount; idx++) 
          { 
           Console.Write("{0} ", dr[idx].ToString()); 
          } 

          Console.WriteLine(); 
         } 
        } 

        Console.WriteLine("Command execution complete."); 
       } 
       catch (SqlException ex) 
       { 
        DisplaySqlErrors(ex); 
       } 
       finally 
       { 
        command.Connection.Close(); 
       } 
      } 
     } 

     private static void DisplaySqlErrors(SqlException exception) 
     { 
      foreach (SqlError err in exception.Errors) 
      { 
       Console.WriteLine("ERROR: {0}", err.Message); 
      } 
     } 

     private static void OnInfoMessage(object sender, SqlInfoMessageEventArgs e) 
     { 
      foreach (SqlError info in e.Errors) 
      { 
       Console.WriteLine("INFO: {0}", info.Message); 
      } 
     } 

     private static void OnStateChange(object sender, StateChangeEventArgs e) 
     { 
      Console.WriteLine("Connection state changed: {0} => {1}", e.OriginalState, e.CurrentState); 
     } 
    } 
} 
2

它非常難以獲取SSMS消息,前端應用的理想方式。但是,您可以將消息寫入文本文件,然後從文件中讀取數據。

declare @cmd varchar(1000) 

SET @cmd = 'osql -S YourServer -E -d YourDatabase -q "RESTORE VERIFYONLY FROM DISK=''c:\yourBackup.bkp''" -o c:\result.txt' 

EXEC master.dbo.xp_cmdshell @cmd 

您可以從您的應用程序執行上面的SQL語句,然後讀取來自的Result.txt文件

相關問題