Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > использование RAISERROR


Автор: Stalnoj 14.5.2005, 17:33
Вопрос такой. Есть у меня триггер:

Код
CREATE     TRIGGER clients_trigger ON Clients 
FOR INSERT
AS 
INSERT INTO Clients_buffer SELECT *, SUSER_SID(), GETDATE() 
FROM inserted
RAISERROR('Операция вставки строки зафиксирована', 16, 1)


В котором при изменении таблицы Clients в таблицу Clients_buffer добавляется строка с информацией о добавленном клиенте, с пользователем, добавившем её и с временем добавления. Хотел бы также к триггеру припаять RAISEERROR (сейчас он может и не так тут важен, но суть не в этом).

Соответственно я создаю такой триггер. Когда в Query Analyzer'е добавляю новую строку в таблицу (INSERT INTO Clients VALUES (...)), мне (все нормально) выдается сообщение

Код
Server: Msg 50000, Level 16, State 1, Procedure clients_trigger, Line 11
Операция вставки строки зафиксирована


Так вот вопрос в следующем: если я добавляю строку из клиентского приложения, могу я как-нибудь получить этот RAISERROR из клиента? Насколько я понял RAISERROR нужен для того, чтобы проинформировать клиентское приложение об ошибке. Так вот как это обработать в клиенте? Клиент написан на C#.net

Автор: Stalnoj 17.5.2005, 16:32
разобрался уже сам во всем. Напишу, может кому пригодится:

Если мы вызываем raiserror, к примеру, такого вида:

Код

raiserror( 'MyError', 1, 1)


то в программе (клиенте) мы можем его перехватить следующим образом:

Код

        public static int Main(string[] args)
        {
            SqlConnection sqlconnection1 = new 
SqlConnection("DataSource=angelsa-ri1;User Id=sa;Password=passw0rd;");
                 sqlconnection1.InfoMessage += new
SqlInfoMessageEventHandler(SqlConnection_OnInfoMessage);
            
            sqlconnection1.Open();
            SqlCommand sqlcommand1 = sqlconnection1.CreateCommand();
            sqlcommand1.CommandText = "Create procedure asb10 as raiserror(
'MyError', 1, 2) ";
            Int32 int321 = sqlcommand1.ExecuteNonQuery();    // -1
            sqlcommand1.CommandType = CommandType.StoredProcedure;
            sqlcommand1.CommandText = "asb10";
            Int32 int322 = sqlcommand1.ExecuteNonQuery();    // -1
            return 1;
        }
        

        public static void SqlConnection_OnInfoMessage(Object sender, SqlInfoMessageEventArgs e)
        {
            Console.WriteLine("InfoMessage Event: " + sender + ", " + e);
        }


В общем все дело в

Код

sqlconnection1.InfoMessage += new SqlInfoMessageEventHandler(SqlConnection_OnInfoMessage);


Но это только для raiserror, чей второй параметр меньше 10 (сообщения). Если же он больше 10, например:

Код

raiserror( 'MyError', 16, 1)


То это уже клиентом считается как ошибка, и вызывает исключение, которое можно примитивно обработать так:
Код

try
{
     sqlcommand1.ExecuteNonQuery();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);  
}


Информацию и примеры черпал: http://www.dotnet247.com/247reference/msgs/18/93680.aspx

Автор: np9mi7 8.6.2005, 18:43
если не .net а BCB, то можно так: http://forum.vingrad.ru/index.php?showtopic=48048

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)