Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
Как послать сообщение об ошибке клиентскому приложению Delphi подключенному по ADO? Конструкции типа:
rollback transaction
raiserror ('Плохо Бро,хочешь что бы твой отпуск закончился раньше чем ты устроился или позже чем уволил', 16, -1)
return 
не помогают. В Delphi сообщение достается вот так:
try
              ADOCommand1.Execute;
          except
              if dm.ADOConnection1.Errors.Count < 1 then Exit;
              for i:=0 to dm.ADOConnection1.Errors.Count-1 do
                  begin
                    case dm.ADOConnection1.Errors[i].NativeError  of
                        2627: MessageDlg ('Такая дата уже существует в базе, будте внимательны ;-)', mtError, [mbOK], 0);
                        else  MessageDlg (dm.ADOConnection1.Errors[i].Source+' '+dm.ADOConnection1.Errors[i].Description, mtError, [mbOK], 0);
                    end;
                  end;
          end;
16 май 13, 09:47    [14303420]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
"Конструкция типа" используется в хп? SET NOCOUNT ON есть в ее первых строках?
16 май 13, 09:58    [14303471]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
pkarklin, нет нету это тригер, код тригера есть в этом топике: https://www.sql.ru/forum/1021869/chto-neponyatno-v-sql-kode-pomogite
16 май 13, 10:00    [14303478]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
DmitryZ78
Member

Откуда: Каменск-Уральский
Сообщений: 87
megazoid007,

  try
    ADOCommand1.Execute;
  except
    on e: Exception do MessageBox(e.Message)
  end;
16 май 13, 10:12    [14303569]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
DmitryZ78,
чета компилятор ругается:
[DCC Error] AddVocationUnit.pas(127): E2010 Incompatible types: 'HWND' and 'string'
16 май 13, 10:30    [14303677]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
megazoid007, ну вообще тем макаром что у меня, успешно перехватываются сообщения об нарушении ограничений CHECK, нарушения целостности и проч, но вот мои месаги чет не хочет
16 май 13, 10:38    [14303732]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
Glory
Member

Откуда:
Сообщений: 104760
megazoid007
не помогают. В Delphi сообщение достается вот так:

Это конструкция ждет exception
Это вовсе не означает, что сообщение сервером не было отправлено.
16 май 13, 10:41    [14303750]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
Блин что за бред не понимаю что не так вот функция:
procedure TAddVocationForm.cxButton2Click(Sender: TObject);
var
QuaryStr1,QuaryStr2: String;
colday, i: integer;
saly: real;
begin
ValiDataForm;
colday:=DaysBetween(cxDateEdit2.Date,cxDateEdit3.Date);
    with ComboBox1 do
    begin
      saly:=(TEmpl(Items.Objects[ItemIndex]).avesal/29.7)*colday;
      QuaryStr1:=EmptyStr;
      QuaryStr2:=EmptyStr;
      QuaryStr1:='insert into vocation (idemployee';
      QuaryStr2:=' values('+IntToStr(TEmpl(Items.Objects[ItemIndex]).id);
      if Trim(cxTextEdit1.Text)<>'' then
      begin
          QuaryStr1:=QuaryStr1+',ordernum';
          QuaryStr2:=QuaryStr2+','''+Trim(cxTextEdit1.Text)+'''';
      end;
      if cxDateEdit1.Text<>'' then
      begin
          QuaryStr1:=QuaryStr1+',orderdate';
          QuaryStr2:=QuaryStr2+','''+DateToStr(cxDateEdit1.Date,myformat)+'''';
      end;
          QuaryStr1:=QuaryStr1+',datestart';
          QuaryStr2:=QuaryStr2+','''+DateToStr(cxDateEdit2.Date,myformat)+'''';
          QuaryStr1:=QuaryStr1+',dateend';
          QuaryStr2:=QuaryStr2+','''+DateToStr(cxDateEdit3.Date,myformat)+'''';
          QuaryStr1:=QuaryStr1+',vocdays';
          QuaryStr2:=QuaryStr2+','+IntToStr(colday);
          QuaryStr1:=QuaryStr1+',paiddays';
          QuaryStr2:=QuaryStr2+','+IntToStr(colday);
          QuaryStr1:=QuaryStr1+',vacationsum)';
          QuaryStr2:=QuaryStr2+','+StringReplace(FloatToStr(saly),',','.',[])+')';
    end;
    ADOCommand1.CommandText:=EmptyStr;
    ADOCommand1.CommandText:=QuaryStr1+QuaryStr2;
    Application.MessageBox(PAnsiChar(QuaryStr1+QuaryStr2),'Worning',0);
    try
        ADOCommand1.Execute;
    except
        on e: Exception do MessageBox(e.Message);
    end;
    VocationForm.ADODataSet1.Requery;
end; 


в ней вылазит такое сообщение: [DCC Error] AddVocationUnit.pas(126): E2010 Incompatible types: 'HWND' and 'string'
16 май 13, 10:49    [14303807]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
на строке
 on e: Exception do MessageBox(e.Message);
16 май 13, 10:50    [14303811]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
megazoid007,

в общем эта конструкция тоже ничего не возвращает:

    try
        ADOCommand1.Execute;
    except
        on e: Exception do  Application.MessageBox(PAnsiChar(e.Message),'Worning',0);
    end;
16 май 13, 11:09    [14303949]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
Glory
Member

Откуда:
Сообщений: 104760
megazoid007
в общем эта конструкция тоже ничего не возвращает:

Это значит
- except срабатывает, но ничего не отображается ?
или
- except не срабатывает ?
16 май 13, 11:12    [14303972]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
Glory, ну т.е. сообщение не выводится, исключений никаких не возбуждается, все ровно кроме того что в базу запись не добавляться (из за триггера), а в sql management studio если вставить некорректное данные (с точки зрения триггера) то сообщение выводится
16 май 13, 11:19    [14304026]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
Glory
Member

Откуда:
Сообщений: 104760
megazoid007
исключений никаких не возбуждается

И как вы тогда проверяете, что сообщение не было отослано то ?

megazoid007
а в sql management studio если вставить некорректное данные (с точки зрения триггера) то сообщение выводится

А sql management studio тоже клиентское приложение между прочим
Которое точно также работает с сервером через коннект.
16 май 13, 11:21    [14304053]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
DmitryZ78
Member

Откуда: Каменск-Уральский
Сообщений: 87
megazoid007,

чем исключение генерите, raiserror или print) ?
16 май 13, 11:29    [14304112]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
Glory, об исключениях полученных от сервера до сегодняшнего случая я определял:
          try
              ADOCommand1.Execute;
          except
              if dm.ADOConnection1.Errors.Count < 1 then Exit;
              for i:=0 to dm.ADOConnection1.Errors.Count-1 do
                  begin
                    case dm.ADOConnection1.Errors[i].NativeError  of
                        2627: MessageDlg ('Такая дата уже существует в базе, будте внимательны ;-)', mtError, [mbOK], 0);
                        else  MessageDlg (dm.ADOConnection1.Errors[i].Source+' '+dm.ADOConnection1.Errors[i].Description, mtError, [mbOK], 0);
                    end;
                  end;
          end; 

но это касалось исключений сервера предопределенных разработчиками, ну тоесть ограничений целостности или еще каких нить ограничений указанных при создании таблицы. Ну вообще я не утверждал что я как то это определял, просто по идее сервак вроде как должен отправить, а клиент получить, а как на самом деле я собственно за помощью и обратился
16 май 13, 11:32    [14304144]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
DmitryZ78, raiserror
16 май 13, 11:32    [14304150]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
megazoid007,

Вам уже намекнули на set nocount on.
16 май 13, 11:38    [14304207]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
invm, да но мне это непомогло
16 май 13, 11:49    [14304305]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
Ну хотя бы скажи, по средством raiserror 100% сообщение до клиента должно доходить или надо что то дополнительно колдовать, просто что бы определить где разбираться на сервере или на клиенте
16 май 13, 12:04    [14304461]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
megazoid007,

может пошаманить с тем, что активирует триггер?
тот же nocount или ошибка перехватывается
16 май 13, 12:54    [14304870]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
оу, не посмотрел: там инсерт собирается
16 май 13, 12:56    [14304887]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
а еще вот что интересно:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]

state
Is an integer from 0 through 255. Negative values or values larger than 255 generate an error.
16 май 13, 13:00    [14304935]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
hoha_ftf, т.е. вы имеете ввиду использовать отрицательное значение или завышенное что бы вызвать исключение ?
16 май 13, 13:09    [14305016]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
megazoid007
Member

Откуда:
Сообщений: 225
state на сколько я понял нужно использовать когда нужно отличать сообщения с одинаковым кодом
16 май 13, 13:17    [14305091]     Ответить | Цитировать Сообщить модератору
 Re: Как послать сообще об ошибке клиентскому приложению?  [new]
Glory
Member

Откуда:
Сообщений: 104760
megazoid007
Ну хотя бы скажи, по средством raiserror 100% сообщение до клиента должно доходить или надо что то дополнительно колдовать, просто что бы определить где разбираться на сервере или на клиенте

На клиенте надо читать _все_ сообщения, которые передает сервер.
16 май 13, 13:19    [14305100]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить