2012-05-30 2 views
4

은 내가 SSMS에서 명령을 실행하면 SQL 서버에 대해 명령이 반환SQL Server 시스템 메시지에서 반환 값을 얻으려면 어떻게해야합니까?

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

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

익스프레스 난 그냥 사용하여 C#에서 수행 한 백업을 확인하려고 '파일 (1) 유효에 백업 세트를.' 이 코드를 어떻게 작성하면 되겠습니까?

리턴되는 행이 없으므로 독자가 작동하지 않습니다.

참고 : SMO.Restore 개체를 시도하고 확인하려고 시도했지만 작동하지 않으며 이것이 내가이 방법을 사용하고있는 이유입니다.

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

BTW -이 내가 프런트 엔드 응용 프로그램에 SSMS 메시지를 검색하는 데 꽤 어려운

답변

14

정보 메시지 및 인쇄 출력 (이하 10 이상의 심각도 포함)의 Result.txt 파일에서 결과를 읽을 수있다, SqlConnection 인스턴스에 의해 InfoMessage 이벤트로 발생합니다. 각 이벤트에는 SqlError 개체 컬렉션이 포함되어 있습니다 (SqlException.Errors에서 사용 된 것과 동일한 클래스입니다).

다음은 연결 상태 변경, 정보 메시지 및 예외를 보여주는 완전한 예입니다. ExecuteNonQuery 대신 ExecuteReader을 사용하지만 정보와 예외 결과는 같습니다.

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

그 일을하려고하고 무엇을 달성 할 수있는 이상적인 방법이라고 생각하지 않는 제안을 엽니 다. 그러나 메시지를 텍스트 파일에 기록한 다음 파일에서 데이터를 읽을 수 있습니다.

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 문을 실행 한 후 클라이언트에 반환되는

관련 문제