How can I get the return value from Sql Server system message?

后端 未结 2 1818
天涯浪人
天涯浪人 2020-12-19 13:27

I am trying to verify the backup I have just done in c# using command against sql server Express

 string _commandText =  string.Format(\"RESTORE VERIFYONLY F         


        
相关标签:
2条回答
  • 2020-12-19 14:13

    Informational messages (with severity less than 10) and PRINT output are returned to the client, and raised as InfoMessage events by the SqlConnection instance. Each event contains a collection of SqlError objects (this is the same class used in SqlException.Errors).

    Here's a complete example that shows connection state changes, info messages and exceptions. Note that I use ExecuteReader instead of ExecuteNonQuery, but the info and exception results are the same.

    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);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-19 14:22

    Its pretty difficult to retrieve the ssms message to the front end application . However you can write the message into a text file and then read the data from the file .

    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
    

    You can execute the above sql statements from your application and then read the result from the result.txt file

    0 讨论(0)
提交回复
热议问题