![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отловить ошибку при добавлени в БД методом Post [D6, dBase, FoxPro]
Lixodei © (2006-11-27 09:06:00)Привет Всем! Выбираю данные из одной БД и пытаюсь их добавить в другую медом Post. Иногда прога почему то вылетает сообщая о следующей ошибке "Access to table disabled because of previous error. Read failure". А мне никак нельзя, чтобы программа вылетала, можно ли отловить ошибку на этапе добавления и просто не добавлять эту запись? Спасибо, за помощь!
Lixodei (2006-11-29 14:44:00) [1]
> NSERT INTO
> вместо работы с TTable. Ибо отлуп по TQuery.Execute не должен
> привести к таким последствиям, как ' "Access to table disabled
> because of previous error. Read failure"'
Приводит к той же ошибке, что и была при работе с TTable
while not AdsQuery1.Eof do
begin
Table1.Active:=false;
Query1.Active:=False;
Query1.FetchAll;
Query1.DatabaseName:=''+Unit1.Work_dir+'\DATA';
Query1.SQL.Clear;
Query1.SQL.Add('INSERT INTO otchet (KOD,PNAME,TYPE_DOC,NUMDOC,DATDOC,DSUM,T_DOC) VALUES (');
Query1.SQL.Add(':D,:P,:E,:N,:D1,:S,:T)');
Query1.ParamByName('D').AsFloat:=AdsQuery1.FieldByName('DANAL1').AsFloat;
Query1.ParamByName('P').AsString:=Trim(AdsQuery1.FieldByName('PNAME').AsString);
Query1.ParamByName('E').AsString:=AdsQuery1.FieldByName('EXPR').AsString;
Query1.ParamByName('N').AsString:=Trim(AdsQuery1.FieldByName('NUMDOC').AsString) ;
Query1.ParamByName('D1').AsDateTime:=AdsQuery1.FieldByName('DATDOC').AsDateTime;
Query1.ParamByName('S').AsFloat:=AdsQuery1.FieldByName('SUM').AsFloat;
Query1.ParamByName('T').AsFloat:=2;
Query1.ExecSQL;
AdsQuery1.Next;
end;
Lixodei (2006-11-29 13:45:00) [2]
> Афигеть - дурдом....
Точно дурдом, это я просто криво поправил, уже путаюсь блин в строках, извините.
Query1.SQL.Add('INSERT INTO simple (KOD) VALUES (:D)');
Query1.ParamByName('D').AsInteger:=AdsQuery1.FieldByName('DANAL1').AsInteger;
Плохиш (2006-11-29 13:40:00) [3]
> Lixodei © (29.11.06 11:59) [10]
> Query1.ParamByName('D'). AsInteger:=AdsQuery1.FieldByName('KOD'). AsString;
Афигеть - дурдом....
Lixodei (2006-11-29 13:18:00) [4]Постараюсь понятнее. Есть таблица из нее происходит выборка данных по нескольким полям на SQL и записываться в ADSQuery1. Среди них есть несколько полей с типом numeric. Теперь эти данные надо записать в другую таблицу otchet. Это я пытаюсь сделать кодом[пример приведен в [10]] на этапе выполнения которого вылетает ошибка не совместимость типов.
Anatoly Podgoretsky (2006-11-29 13:10:00) [5]Еще большими загадками стал говорить.
Кто на чем стоял?
Lixodei (2006-11-29 12:53:00) [6]Query1.ParamByName('D').As... нужен другой тип, при присвоении все проходит нормально, ошибка когда выполняется. Если поменять тип поля KOD в самой БД, то все отлично
Anatoly Podgoretsky (2006-11-29 12:15:00) [7]> Lixodei (29.11.2006 11:59:10) [10]
На левую или правую часть?
Что сообзает компонент о типах в рантайм
Lixodei (2006-11-29 11:59:00) [8]
> MsGuns © (27.11.06 16:47) [9]
, да действительно можно сделать запросом, но вот при запросе SQL возникает проблема при передаче параметра. Поле KOD имеет тип numeric(5,0), а в Delphi такого типа нет. Аналогичный ему должен быть Integer, но SQL ругаеться на несовместимость. Может другой надо использовать тип?
Query1.SQL.Add('INSERT INTO otchet (KOD) VALUES (:D)');
Query1.ParamByName('D').AsInteger:=AdsQuery1.FieldByName('KOD').AsString;
MsGuns (2006-11-27 16:47:00) [9]Судя по [2] данные из одной таблицы (запроса) добавляются в другую. Почему нельзя это сделать запросом ?
Lixodei (2006-11-27 13:09:00) [10]
> Это Вы сейчас на каком языке говорили?
На русском, а что не видно? БД из которой выбираю данные формирует другая прога, ей и перезаполняю, ошибка в уже в другой записи.
> Классная такая чушь...
А разве квейри - это не набор данных оформленный в виде виртуальной таблицы
Поэтому я думаю, что не чушь я писал
Anatoly Podgoretsky (2006-11-27 12:23:00) [11]> Lixodei (27.11.2006 09:06:00) [0]
because of previouserror.
Плохиш (2006-11-27 12:14:00) [12]
> так как когда я переформировываю БД по данному полю ошибка
> переходит уже на другой записи
Это Вы сейчас на каком языке говорили?
> except
Cancel;
> Form1.Edit1.Text:='Ошибка '+AdsQuery1.FieldByName('DANAL1').
> AsString+' '+AdsQuery1.FieldByName('PNAME').AsString+'
и запись будет пропущена.
> Просто его все равно надо будет переписывать рано или поздно
> в тэйбл, так как инфа потом нужна в физическом сохранении.
Классная такая чушь...
ЮЮ (2006-11-27 10:42:00) [13]
> не в table, а кверик? Просто его все равно надо будет
> переписывать рано или поздно в тэйбл,
Имелось в виду исполнять запросы
INSERT INTO
вместо работы с TTable. Ибо отлуп по TQuery.Execute не должен привести к таким последствиям, как ' "Access to table disabled because of previous error. Read failure"'
Lixodei (2006-11-27 10:35:00) [14]C уникальностью и заполненностью все в порядке, тут быть не может собаки ;] Разрядность полей тоже совпадает. А вы предлагаете писать данные не в table, а кверик? Просто его все равно надо будет переписывать рано или поздно в тэйбл, так как инфа потом нужна в физическом сохранении. Начальный вопрос был в том, что разве нет больше инструмента кроме try чтобы ошибку отловить, например, как при проверке значения переменной при открытии файла или загрузке dll-ки?
Sergey13 (2006-11-27 10:17:00) [15]Я с dbf-ками со времен клиппера не работал. Как там насчет требований уникальности и/или заполненности? Может тут собака порылась? И почему бы не попробовать писать новые записи так-же через кверик запросом?
Lixodei (2006-11-27 10:03:00) [16]try не помогает, вылетает с той же ошибкой или может я не правильно делаю что. Через дебагер проверил данные на запись они соответствуют, тем которые нужны. Может есть с ними еще какой-то мусор, который я не вижу?, так как когда я переформировываю БД по данному полю ошибка переходит уже на другой записи
while not AdsQuery1.Eof do
begin
with Table1 do
begin
Append;
FieldByName('KOD').AsInteger:=AdsQuery1.FieldByName('DANAL1').AsInteger;
FieldByName('PNAME').AsString:=AdsQuery1.FieldByName('PNAME').AsString;
FieldByName('TYPE_DOC').AsString:=AdsQuery1.FieldByName('EXPR').AsString;
FieldByName('NUMDOC').AsString:=AdsQuery1.FieldByName('NUMDOC').AsString;
FieldByName('DATDOC').AsString:=AdsQuery1.FieldByName('DATDOC').AsString;
FieldByName('DSUM').AsFloat:=AdsQuery1.FieldByName('SUM').AsFloat;
FieldByName('T_DOC').AsInteger:=2;
try
Post;
except
Form1.Edit1.Text:='Ошибка '+AdsQuery1.FieldByName('DANAL1').AsString+' '+AdsQuery1.FieldByName('PNAME').AsString+' '+AdsQuery1.FieldByName('EXPR').AsString+' '+AdsQuery1.FieldByName('NUMDOC').AsString+' '+AdsQuery1.FieldByName('DATDOC').AsString+' '+AdsQuery1.FieldByName('SUM').AsString;
sleep(1000);
end;
end;
AdsQuery1.Next;
end;
Sergey13 (2006-11-27 09:22:00) [17]Вообще ошибки ловятся через try. Проверить то что будет записано можно в BeforePost принимающего датасета.