![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка: Поставщик данных ....... состояние E_FAIL [D2005, XP]
oleg_veles © (2011-07-26 11:02:00)Добрый день ! Помогите разобраться с ошибкой:
Поставщик данных или другая служба вернули состояние E_FAIL.
Вылетает при выполнении следующего куска:
procedure TForm2.BitBtn2Click(Sender: TObject);
Var
Stroca: String;
Konec: String;
Nachalo: String;
Schet:String;
d: Integer;
r: Integer;
m:integer;
n:integer;
f:integer;
begin
Begin
//Определим количество записей в секции
For i:=0 to Memo1.Lines.Count -1 do // Запускаем цикл поиска строки начала документа
If Pos('СЕКЦИЯДОКУМЕНТ', Memo1.Lines[i])<>0 Then
Begin
m := i;
End;
For d:=0 to Memo1.Lines.Count -1 do // Запускаем цикл поиска строки конца документа
If Pos('КОНЕЦДОКУМЕНТА', Memo1.Lines[d])<>0 Then
Begin
n := d;
End;
r := n-m;// Количество строк документа
end;
For i:=0 to Memo1.Lines.Count -1 do // Запускаем цикл поиска строки начала документа
If Pos('СЕКЦИЯДОКУМЕНТ', Memo1.Lines[i])<>0
Then
Begin
ADOTable1.Append;
for f := 1 to r do
Begin
rsh := Memo1.Lines[f + i];// Строка документа
Stroca := Copy(rsh, 1, 6);
Konec := Copy(rsh, 1, 14);
Schet := Copy(rsh, 1, 13);
Znach := Copy(rsh,Pos('=',rsh)+1, Length(Rsh));
if Znach = '' then Znach := '0';
ADOTable1.Edit;
If (Stroca = 'ДАТАСП') OR (Stroca = 'ДАТАПО') OR (Stroca = 'ДАТАОП') Then Begin
ADOTable1Data.Value := Znach
end
Else
If (Stroca = 'СУММА=') OR (Stroca = 'СУММАП') OR (Stroca = 'СУММАР') Then Begin
ADOTable1Summa.Value := Znach
end
Else
If (Schet = 'ПЛАТЕЛЬЩИКСЧЕ') OR (Schet = 'ПЛАТЕЛЬЩИКИИК') OR (Schet = 'ПЛАТЕЛЬЩИК2 ') Then Begin
ADOTable1PlatSchet.Value := Znach
end
Else
If Stroca = 'НАЗНАЧ' Then Begin
ADOTable1NaznPlat.Value := Znach;
ADOTable1Bank.Value := Nomer;
If Konec = 'КОНЕЦДОКУМЕНТА' Then End;
End;
ADOTable1.Post;
End;
ADOTable1.Active := False;
Memo1.CharCase := ecNormal;
ADOTable1.Active := True;
end;
Вылетает непонятно в каком месте и не зависит (проверял) от загружаемого файла, т.е. может два раза файл загрузиться, а третий (пятый, двадцатый) появится эта ошибка. Харанее благодарен за ответ...
Inovet (2011-09-15 14:34:00) [1]> [25] skiph © (15.09.11 12:05)
> е все поля T2.key и Mainfield будут иметь значение (они будут равны NULL),
А такой запрос
SELECT * FROM T1 WHERE key IS NULL
И такой
SELECT * FROM T2 WHERE key IS NULL
что вернут?
Anatoly Podgoretsky (2011-09-15 13:46:00) [2]> skiph (15.09.2011 12:05:25) [25]
Чудеса, но попробуй поставить другой сервер, это налицо непригодный.
skiph (2011-09-15 12:05:00) [3]По поводу NULL уточню: Ошибка возникает, когда NULL содержится в поле, которое не может быть NULL-евым. Объясню, как такое возможно.
Предположим, что у нас есть 2 таблицы: Основная Т1 и справочник Т2 (имеет поля key и mainfield) и мы хотим выполнить запрос вида
SELECT *
FROM T1 LEFT OUTER JOIN T2 ON T1.key=T2.key
Ясное дело, что при таком соединении в результирующей таблице не все поля T2.key и Mainfield будут иметь значение (они будут равны NULL), однако в описании таблицы T2, скорее всего, они будут обязательными
skiph (2011-09-15 11:44:00) [4]Подобная проблема связана с тем, что в исходных данных содержатся значения данных NULL либо дата и/или время в значении "0000-00-00"/"00:00:00"
Игорь Шевченко (2011-07-26 14:29:00) [5]
> а что не так?
а то, что заполнять имеет смысл только при том типе исключения, когда в ac1.Errors гарантировано содержится актуальная информация.
SQLEXPRESS (2011-07-26 14:12:00) [6]а что не так?
M: TADOCommand;
begin
try
M.Execute; // AV
except
on E:Exception do
begin
for i := 0 to ac1.Errors.Count - 1 do // ошибок не найдено
mmo1.Lines.Add(ac1.Errors.Item[i].Source + ac1.Errors.Item[i].Description);
raise; // ловите AV выше
end;
end
Игорь Шевченко (2011-07-26 13:59:00) [7]
> on E:Exception do
при EAccessViolation будет масса полезной информации.
"Только массовые расстрелы спасут отечество"
SQLEXPRESS (2011-07-26 13:01:00) [8]попробуйте еще обернуть в
try
except
on E:Exception do
begin
for i := 0 to ac1.Errors.Count - 1 do
mmo1.Lines.Add(ac1.Errors.Item[i].Source + ac1.Errors.Item[i].Description);
raise;
end;
end
mmo1 - Tmemo
ac1 - TAdoConnection
ничего нового не читается?
Dennis I. Komarov (2011-07-26 12:10:00) [9]
> oleg_veles (26.07.11 12:06) [18]
Начинающим, надо учиться, а не лезть решать задачи бухгалтеров. Ничего личного, просто задолбали такие горе-программисты, после которых...
oleg_veles (2011-07-26 12:06:00) [10]Всем спасибо... Буду пробовать...
Для критикующих - форум называется: "Начинающим".
"Все проходит - и это пройдет"
(Надпись на пестне Соломона)
Плохиш (2011-07-26 12:06:00) [11]Это правильно. Сначала высосать ... пардон ... создать проблему, а затем еë героически решать...
Только не понятно, чë они сюда прутся, здесь же не решают высосанных проблем?
sniknik (2011-07-26 12:00:00) [12]> Хотя тут, конечно, нужно все переписать через ADODataSet.
на ADOCommand, тут нет отображения/работы с рекордсетом, тут только запись в таблицу.
oleg_veles (2011-07-26 12:00:00) [13]
> И. Павел
> Хотя тут, конечно, нужно все переписать через ADODataSet.
Спасибо, буду пробовать...
sniknik (2011-07-26 11:59:00) [14]> автора придать анафеме
придать, но за ADOTable1, ламеризм, и не использование параметризованных запросов.
Znach := Copy(rsh,Pos('=',rsh)+1, Length(Rsh));
if Znach = '' then Znach := '0';
например
Znach := "####.##";
???
> а может и нет... связи не нахожу...
запись разных данных. в смысле правильных и не правильных.
И. Павел (2011-07-26 11:57:00) [15]> [9] oleg_veles (26.07.11 11:49)
Посмотрите - если у вас MDAC ниже версии 2.6 то может быть ошибка связана с багом Микрософта. Тогда просто обновите MDAC.
Хотя тут, конечно, нужно все переписать через ADODataSet.
Dennis I. Komarov (2011-07-26 11:54:00) [16]т.е. [2] и [7]
Dennis I. Komarov (2011-07-26 11:52:00) [17]
> Где тут SQL !
Вот нету, а быть должен.
> И за что ? За то что вынужден выполнять прихоть бухов?
За написание такого кода в приложении, используемого в коммерческих целях
> А по существу вопроса можешь что подсказать ?
Читай [1] и [7] до полного просветления
SQLEXPRESS (2011-07-26 11:52:00) [18]у меня что-то было такое, все переписал на
begintran
INSERT INTO (F1, F2) VALUES (:F1, :F2)
parameters.parambyname(F1).type :=
parambyname(F1).value :=
и т.п.
committran
чистую таблицу, файл, тестовый проектик посмотрит может кто
oleg_veles (2011-07-26 11:49:00) [19]
> Anatoly Podgoretsky
А как мне тут TAdoDatasetпоможет ? Если бы надо было работать с готовым набором данных то я и использовал бы тот же SQL. А тут выписки банковские, при чем документы содержат произвольное число строк. Да и поля текстовые сами видете по IF-ам минимум трех вариантов....
oleg_veles (2011-07-26 11:40:00) [20]
> Даже после трассирования непонятно?
Но это ни о чём... может вылететь в ошибку, а может и нет... связи не нахожу...