Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.07.2010, 18:58
newbas newbas вне форума
Прохожий
 
Регистрация: 04.08.2009
Сообщения: 11
Репутация: 10
По умолчанию Компоненты ADO (AdoQuery) в отдельном потоке

Присутствует неадекватное поведение компонента ADOQuery в отдельном потоке - компонент выполняет запрос на добавление записи в таблицу в отдельном потоке. При этом добавляется 1 запись, а при добавлении 2-й поток виснет на методе ExecuteSQL.
Класс потока описан:
Код:
  TNewThread = class(TThread)
    private
      { Private declarations }
    protected
      procedure Execute; override;
      Procedure SyncDelete;
      Procedure SyncAddLog;
      Procedure SyncClose;
      Function FindTransaction(NoTrans:Integer):Boolean;
    public
      FileName:string;
      NoKKM, NoRep, NoTrans:longInt;
      Percent:integer;
      tqFind, tqAppend:TADOQuery;
      Msg:String;
      cmd:byte;
    end;

Function TNewThread.FindTransaction(NoTrans:Integer):Boolean;
begin
  tqFind.Close;
  tqFind.Parameters.ParamByName('NoTrans').Value:= NoTrans;
  tqFind.ExecSQL;
  tqFind.Open;
  Result := not tqFind.IsEmpty;
end;

procedure TNewThread.SyncDelete;
begin
  ListThread.Remove(Self);
end;

procedure TNewThread.SyncAddLog;
begin
  Form1.AddLog(Msg, cmd);
end;

procedure TNewThread.Execute;
Var TypeTrans, NoCheck, User, MaxPos, zNoKKM:Longint;
   zCount, Price, Summa: Single;
   Date, Time, Code, Section:String;
   s,s1:String;
   f:TextFile;

begin
   // Запрос для поиска транзакций
   tqFind.SQL.Clear;
   With tqFind.SQL do
     begin
       Add('SELECT Транзакции.Касса, Транзакции.НомерТранзакции ');
       Add('FROM Транзакции ');
       Add('WHERE (((Транзакции.Касса)= :Kassa) AND ((Транзакции.НомерТранзакции)= :NoTrans));');
     end;
   tqFind.Parameters.ParamByName('Kassa').DataType  := ftInteger;
   tqFind.Parameters.ParamByName('NoTrans').DataType:= ftInteger;
   tqFind.Parameters.ParamByName('Kassa').Value     := NoKKM;

   // Запрос на добавление записей
   With tqAppend.SQL do
      begin
        Clear;
        Add('INSERT INTO Транзакции ');
      Add('(Касса,НомерТранзакции,Дата,Время,ТипТранзакции,НомерЧека,КодКассира,Код,Секция,Цена,Количество,Сумма)');
        Add('VALUES (:Kassa, :NoTrans, :Data, :Time, :TypeTrans, :NoCheck, :KodUser, :Code, :Section, :Price, :Count, :Summa)');
      end;
   With tqAppend.Parameters do
      begin
        ParamByName('Kassa').DataType   := ftInteger;
        ParamByName('Kassa').Value      := NoKKM;
        ParamByName('NoTrans').DataType := ftInteger;
        ParamByName('Data').DataType    := ftDateTime;
        ParamByName('Time').DataType    := ftDateTime;
        ParamByName('TypeTrans').DataType:=ftInteger;
        ParamByName('KodUser').DataType := ftInteger;
        ParamByName('NoCheck').DataType := ftInteger;
        ParamByName('Code').DataType    := ftString;
        ParamByName('Section').DataType := ftString;
        ParamByName('Price').DataType   := ftCurrency;
        ParamByName('Count').DataType   := ftFloat;
        ParamByName('Summa').DataType   := ftCurrency;
      end;

   cmd :=0;
   // Откроем файл для чтения
   AssignFile(f, FileName);
   try
      Reset(f);
   except
      Msg  := 'Ошибка открытия файла '+FileName;
      Synchronize(SyncAddLog);
      Synchronize(SyncDelete);        // удаляем из списка поток
      exit;
   end;

   MaxPos :=FileSize(f);
   While not Eof(f) do
      begin
         try
             Readln(f,s);
             Percent := Round(100*FilePos(f)/MaxPos);
             If s = '#' then
              begin
                // Следующийотчет в одном файле
                Readln(f,s);
                Readln(f,s);
                Readln(f,s);
              end;
         except
            Msg  := 'Ошибка обработки файла '+FileName;
            Synchronize(SyncAddLog);
            Synchronize(SyncDelete);        // удаляем из списка поток
            CloseFile(f);
            exit;
         end;

         try
           NoTrans := StrToInt(FromString(s));  // НомерТранзакции = Число(СтрПолучитьСтроку( Стр, 1 ) );
           Date    := Trim(FromString(s));      // ДатаТранзакции  = Дата( СтрПолучитьСтроку( Стр, 2 ) );
           Time    := Trim(FromString(s));      // ВремяТранзакции = СтрПолучитьСтроку( Стр, 3 );
           TypeTrans:= StrToInt(FromString(s)); // ТипТранзакции   = Число( СтрПолучитьСтроку( Стр, 4 ) );
         except
            Msg  := 'Ошибка обработки файла '+FileName;
            Synchronize(SyncAddLog);
            Synchronize(SyncDelete);        // удаляем из списка поток
            CloseFile(f);
            exit;
         end;

         If TypeTrans in [24,50,51,65,66,150,60,62,63,90,91,40,58] then  Continue;  // пропускаем открытие ящика и др.

         IsEmpty := true;
         Synchronize(FindTransaction);
         If IsEmpty then Continue;

         Try
           zNoKKM   := StrToInt(FromString(s));  // НомерККМ        = Число( СтрПолучитьСтроку( Стр, 5 ) );
           NoCheck := StrToInt(FromString(s));  // НомерЧека       = Число( СтрПолучитьСтроку( Стр, 6 ) );
           User    := StrToInt(FromString(s));  // Кассир          = СтрПолучитьСтроку( Стр, 7 );
           Code    := Trim(FromString(s));      // Код             = СтрПолучитьСтроку( Стр, 8 );
           Section := Trim(FromString(s));      // Секция          = СтрПолучитьСтроку( Стр, 9 );
           Price   := StrToFloat(FromString(s));// Цена            = Число( СтрЗаменить( СтрПолучитьСтроку( Стр, 10 ), ",", "." ) );
           s1      := FromString(s);            // Количество      = Число( СтрЗаменить( СтрПолучитьСтроку( Стр, 11 ), ",", "." ) );
           //zCount   := 0;
           //Val(s1, zCount, i);
           zCount  := StrToFloat(s1, fs);
           Summa   := StrToFloat(FromString(s));// Сумма           = Число( СтрЗаменить( СтрПолучитьСтроку( Стр, 12 ), ",", "." ) );
         except
            Msg  := 'Ошибка обработки файла '+FileName;
            Synchronize(SyncAddLog);
            Synchronize(SyncDelete);        // удаляем из списка поток
            CloseFile(f);
            exit;
         end;

         try
           With tqAppend.Parameters do
              begin
                ParamByName('NoTrans').Value := NoTrans;
                ParamByName('Data').Value    := StrToDate(Date);
                ParamByName('Time').Value    := StrToDateTime(Date+' '+Time);
                ParamByName('TypeTrans').Value:=TypeTrans;
                ParamByName('NoCheck').Value := NoCheck;
                ParamByName('KodUser').Value := User;
                ParamByName('Code').Value    := Code;
                ParamByName('Section').Value := Section;
                ParamByName('Price').Value   := FloatToCurr(Price);
                ParamByName('Count').Value   := Count;
                ParamByName('Summa').Value   := FloatToCurr(Summa);
              end;
          tqAppend.ExecSQL;  // Вот тут и происходит зависание на 2-1 итерации

         except
            Msg  := 'Ошибка обработки файла '+FileName;
            Synchronize(SyncAddLog);
            Synchronize(SyncDelete);        // удаляем из списка поток
            CloseFile(f);
            exit;
         end;
      end;

  Msg  := 'Файл '+FileName+' загружен';
  Synchronize(SyncAddLog);
  Synchronize(SyncDelete);   // удаляем из списка поток
  CloseFile(f);
  try
    DeleteFile(FileName);
  Except
  end;
end;
В чем собственно может быть дело? Есть какая-то особенность работы с ADO в потоке?

Последний раз редактировалось newbas, 04.07.2010 в 19:12.
Ответить с цитированием
  #2  
Старый 04.07.2010, 19:09
Аватар для Marvel
Marvel Marvel вне форума
Начинающий
 
Регистрация: 14.06.2010
Адрес: Пятигорск
Сообщения: 121
Репутация: 24
По умолчанию

попробуйте заменить
Код:
tqAppend: TADOTable;
на
Код:
tqAppend: TADOCommand;
__________________
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы...


ICQ: 593977748
Nick: Marvel
Ответить с цитированием
  #3  
Старый 04.07.2010, 19:11
newbas newbas вне форума
Прохожий
 
Регистрация: 04.08.2009
Сообщения: 11
Репутация: 10
По умолчанию

На самом деле
Цитата:
tqFind, tqAppend:TADOQuery;
Это просто опечатка
Ответить с цитированием
  #4  
Старый 05.07.2010, 01:39
Аватар для Marvel
Marvel Marvel вне форума
Начинающий
 
Регистрация: 14.06.2010
Адрес: Пятигорск
Сообщения: 121
Репутация: 24
По умолчанию

всё равно попробуйте через ADOCommand, он как бэ предназначен для запросов вида INSERT, DELETE, UPDATE
__________________
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы...


ICQ: 593977748
Nick: Marvel
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter