Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Ошибка при добавлении записи в бд методом Insert


Автор: Evenstain 22.2.2010, 17:50
следующая проблема: 
подключил Foxpro базу через ADO и когда пытаюсь добавить в БД запись с помощью метода Insert возникает следующая ошибка:

user posted image


вот приблизительный код, который я использую!
Код

ADOTable1.Active:=false;
ADOTable1.TableName:='sotrudniki';
ADOTable1.Active:=true;

ADOTable1.Insert;

ADOTable1.FieldByName('kod').AsInteger:=strToInt(Edit3.Text) ;
ADOTable1.FieldByName('fio').AsString:=edit1.Text;
ADOTable1.FieldByName('inn').AsInteger:=strtoint(Edit6.Text);
ADOTable1.FieldByName('adress').AsString:=Edit5.Text;
ADOTable1.FieldByName('data_rozhdenia').AsDateTime:=StrToDate(Edit4.Text);
ADOTable1.FieldByName('nomer_pfr').AsInteger:=strtoint(Edit7.Text);
ADOTable1.FieldByName('data_prinyatiya').AsDateTime:=StrToDate(Edit8.Text);
ADOTable1.FieldByName('oklad').AsInteger:=strToInt(Edit2.Text);

ADOTable1.Post;

подскажите, пожалуйста,из за чего может возникать такая ошибка и как от нее избавиться?
заранее благодарен
з.ы. используя метод Edit для редактирования определенной записи, все работает просто замечательно. в данном же случае почему то возникает ошибка  

Автор: Данкинг 22.2.2010, 18:15
Через какой провайдер подключаешь?? Ну, попробуй вместо Insert использовать Append. А вообще ещё лучше запросом значения вставлять.

Автор: Evenstain 22.2.2010, 18:28
Цитата(Данкинг @ 22.2.2010,  18:15)
Через какой провайдер подключаешь?? Ну, попробуй вместо Insert использовать Append. А вообще ещё лучше запросом значения вставлять.

провайдер - Microsoft OLE DB Provider for Visual FoxPro
сейчас попробую через sql - запрос

Автор: Данкинг 22.2.2010, 18:32
Цитата(Evenstain @  22.2.2010,  18:28 Найти цитируемый пост)
провайдер - Microsoft OLE DB Provider for Visual FoxPro

В таком случае, впервые узнаю, что с ним можно редактировать записи с помощью .Edit.  smile 

Автор: Evenstain 22.2.2010, 19:10
Цитата(Данкинг @ 22.2.2010,  18:32)
Цитата(Evenstain @  22.2.2010,  18:28 Найти цитируемый пост)
провайдер - Microsoft OLE DB Provider for Visual FoxPro

В таком случае, впервые узнаю, что с ним можно редактировать записи с помощью .Edit.  smile

а что тут удивительного?! я имел ввиду что то типа

Код

ADOTable1.Active:=false;
ADOTable1.TableName:='sotrudniki';
ADOTable1.Active:=true;
While ADOTable1.FieldByName('fio').AsString<>edit1.Text do
ADOTable1.Next;
ADOTable1.Edit;
ADOTable1.FieldByName('kod').AsInteger:=strToInt(Edit3.Text);
.......................................
.......................................
.......................................
ADOTable1.Post;


кстати, через запрос получилось вроде

Автор: Данкинг 22.2.2010, 19:30
Цитата(Evenstain @  22.2.2010,  19:10 Найти цитируемый пост)
я имел ввиду что то типа

Так это реально рабочий код? 

Цитата(Evenstain @  22.2.2010,  19:10 Найти цитируемый пост)
кстати, через запрос получилось вроде 

Через запрос-то понятно, что получилось. smile 

Автор: Evenstain 23.2.2010, 01:51
Цитата(Данкинг @ 22.2.2010,  19:30)
Так это реально рабочий код?

конечно рабочий. проверь, если не веришь  smile 

но лучше наверно все таки тоже через запрос сделать. так и поступим  smile 

спасибо за совет   smile 

а вот как я сделал запрос для добавления новой записи

Код

with ADOQuery1 do
  begin
    Active:=false;
    SQL.Clear;
    SQL.add('INSERT INTO sotrudniki (тут необходимые поля) VALUES (:kod, :fio, :inn...............  тут параметры)');
    with Parameters do
      begin
        ParamByName('kod').Value:=strtoint(Edit3.Text);
        ParamByName('fio').Value:=Edit1.Text;
        ParamByName('inn').Value:= strtoint(Edit6.Text);
        ...............................................
        ...............................................          
      end;
    ExecSQL;
  end;

вроде правильно сделал  smile 

Автор: Данкинг 23.2.2010, 02:17
Цитата(Evenstain @  23.2.2010,  01:51 Найти цитируемый пост)
конечно рабочий. проверь, если не веришь

Н-да, и правда, почему-то я всегда думал, что таким образом DBF редактировать нельзя. smile 

Цитата(Evenstain @  23.2.2010,  01:51 Найти цитируемый пост)
но лучше наверно все таки тоже через запрос сделать. 

В данном случае - для добавления новой записи -  наверное, всё же логичней запросом.

Цитата(Evenstain @  23.2.2010,  01:51 Найти цитируемый пост)
а вот как я сделал запрос для добавления новой записи

Ну, это понятно. smile 

Автор: CROTishka 24.2.2010, 16:10
Текст ошибки кстати копируется по Ctrl+C

Автор: Evenstain 25.2.2010, 02:34
Цитата(CROTishka @  24.2.2010,  16:10 Найти цитируемый пост)
Текст ошибки кстати копируется по Ctrl+C 

будем знать   smile 

Автор: Evenstain 4.3.2010, 16:13
а еще один вопрос.
вот я хочу обработать исключительную ситуацию возникновения ошибки класса EOleException

ну, например:

Цитата

---------------------------
Debugger Exception Notification
---------------------------
Project Zarplata.exe raised exception class EOleException with message 'Uniqueness of index INDEX is violated'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------



вот код, с помощью которого пытаюсь отловить ситуацию

Код

try
  .............
  .............
except
  on EOleException do 
begin
.................
.................
end
  ...
end;

но Delphi ругается, что нету такого класса ошибок как EOleException. видимо, я что то не понимаю. помогите, пожалуйста

P.S. написал в разделе type: EOleException = class(Exception); вроде работает, но ошибку не ловит. что я делаю не так??

Автор: Fitc 4.3.2010, 20:17
Цитата(Evenstain @  4.3.2010,  16:13 Найти цитируемый пост)
P.S. написал в разделе type: EOleException = class(Exception); вроде работает, но ошибку не ловит. что я делаю не так??

Я так понимаю ты наследуешь класс Exception... и класс потомок EoleException поэтому работает

Автор: Evenstain 5.3.2010, 12:22
ну кто нибудь напишите как решить проблему. а то создам новую тему и захламлю форум  smile 
просто непонятно почему другие классы ошибок delphi видит, а EoleException нифига

Автор: pseud 5.3.2010, 16:47
Цитата(Evenstain @  4.3.2010,  16:13 Найти цитируемый пост)
P.S. написал в разделе type: EOleException = class(Exception); вроде работает, но ошибку не ловит. что я делаю не так??

читаем хелп:
Цитата

EOleException is the exception class for OLE automation errors that occur in methods or properties of an object.
Unit
ComObj

не создавай свой класс EOleException (не справшивай почему), а в uses пропиши ComObj.

Автор: Evenstain 6.3.2010, 12:36
Цитата(pseud @ 5.3.2010,  16:47)
Цитата(Evenstain @  4.3.2010,  16:13 Найти цитируемый пост)
P.S. написал в разделе type: EOleException = class(Exception); вроде работает, но ошибку не ловит. что я делаю не так??

читаем хелп:
Цитата

EOleException is the exception class for OLE automation errors that occur in methods or properties of an object.
Unit
ComObj

не создавай свой класс EOleException (не справшивай почему), а в uses пропиши ComObj.

спасибо огромное! тока что то все равно не перехватывает ошибку, выдает как обычно

Цитата

---------------------------
Debugger Exception Notification
---------------------------
Project Zarplata.exe raised exception class EOleException with message 'Uniqueness of index INDEX is violated'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------


вот код, который использую
Код

try
  with ADOQuery2 do
  begin
    Active:=false;
    SQL.Clear;
    SQL.add('INSERT INTO zarplata (kod_sotr,date,oklad,premia,otpusk,doplata,ndfl) VALUES     (:kod_sotr,:date,:oklad,:premia,:otpusk,:doplata,:ndfl)');
    with Parameters do
      begin
        ParamByName('kod_sotr').Value:= ADOQuery3.fieldByName('kod').AsInteger;
        ParamByName('date').Value:=  dateS;
        ParamByName('oklad').Value:= ADOQuery3.fieldByName('oklad').AsInteger;
      ............................................................................
      end;
    ExecSQL;
  end;
 except
  on EOleException do Showmessage('Текст ошибки')
 end;



естественно добавил в uses ComObj, но не ловит все равно

Автор: pseud 9.3.2010, 10:09
Цитата(Evenstain @  6.3.2010,  12:36 Найти цитируемый пост)
спасибо огромное! тока что то все равно не перехватывает ошибку, выдает как обычно

читай внимательно заголовок мессаги
Цитата

Debugger Exception Notification

т.е. в дебаге ты ее таки словишь, после этого вывалится твоя месага 'Текст ошибки'. Не в дебаге появится лишь 'Текст ошибки'.
Если ты и в дебаге не желаешь видеть EOleException, то включи ее в список игнорируемых дебагером месаг:
Цитата

Tools -> Debagger Options -> Language Exceptions -> Exception Types to Ignore -> (Отметить/Добавить) EOleException

Автор: Evenstain 10.3.2010, 18:57
Цитата(pseud @ 9.3.2010,  10:09)
Цитата(Evenstain @  6.3.2010,  12:36 Найти цитируемый пост)
спасибо огромное! тока что то все равно не перехватывает ошибку, выдает как обычно

читай внимательно заголовок мессаги
Цитата

Debugger Exception Notification

т.е. в дебаге ты ее таки словишь, после этого вывалится твоя месага 'Текст ошибки'. Не в дебаге появится лишь 'Текст ошибки'.
Если ты и в дебаге не желаешь видеть EOleException, то включи ее в список игнорируемых дебагером месаг:
Цитата

Tools -> Debagger Options -> Language Exceptions -> Exception Types to Ignore -> (Отметить/Добавить) EOleException

ясно. спасибо за помощь  smile   smile 
жаль не могу поставить +1 к репе

Автор: Marduk 30.3.2010, 16:14
Ошибку можно отловить и так:
Код

try
...
//тут твой код
...
except on E: exception do
  ShowMessage('Ошибка: ' + E.Message);
end;


если в дебаггере отключаешь показ исключений, то это не значит что в проге они не появятся,
мне кажется правильнее когда в самой программе идет обработка ошибок

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