Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка: Поставщик данных ....... состояние E_FAIL [D2005, XP]


Страницы:   1 2

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]


> Даже после трассирования непонятно?

Но это ни о чём... может вылететь в ошибку, а может и нет... связи не нахожу...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо