|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Компоненты 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; Последний раз редактировалось newbas, 04.07.2010 в 19:12. |
#2
|
||||
|
||||
попробуйте заменить
Код:
tqAppend: TADOTable; Код:
tqAppend: TADOCommand; Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы... ICQ: 593977748 Nick: Marvel |
#3
|
|||
|
|||
На самом деле
Цитата:
|
#4
|
||||
|
||||
всё равно попробуйте через ADOCommand, он как бэ предназначен для запросов вида INSERT, DELETE, UPDATE
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы... ICQ: 593977748 Nick: Marvel |