powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 5, ADO, Thread (тред, нити)
6 сообщений из 6, страница 1 из 1
Delphi 5, ADO, Thread (тред, нити)
    #32205867
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ThredMsSQL = class(TThread)
  private
    MsSQL: TADOCommand;
    { Private declarations }
  public
    constructor Create;
  protected
    procedure Execute; override;
  end;

Дальше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure ThredMsSQL.Execute;
begin
  MsSQL:=TADOCommand.Create(self);
  MsSQL.ConnectionString:='Provider=SQLOLEDB.1;Password=xxx;Persist Security Info=False;User ID=xxx;Initial Catalog=tempdb;Data Source=x.x.x.x';
  MsSQL.CommandText:='insert into test values (1, ''Test')';
  MsSQL.Execute;  
  MsSQL.Free;
  MsSQL:=nil;
end;

При компиляции Delphi ругается:
Incompatible types: 'TComponent' and 'ThredMsSQL'
Оно и понятно, ADO же визуальный компонент вот и ругается. Как поправить чтоб в треде можно было использовать ADO.
P.S.:
1. Не говорите, что это можно делать в основной команде, мне тред и нужен, чтоб он вставлял записи в фоновом режиме так сказать (так как за раз надо вставить около 10 тыс записей) - а то что написана одна вставка, это я упрастил, на самом деле вставка идёт по циклу.
2. Создать MsSQL в основной форме и потом через synchronize вставлять записи, я думаю, тогда никакого толку от треда не будет, если вы думаете подругому скажите.
...
Рейтинг: 0 / 0
Delphi 5, ADO, Thread (тред, нити)
    #32205870
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В дагонку:
Этот код использования ADO работает в основной програме, так что сам код точно рабочий.
...
Рейтинг: 0 / 0
Delphi 5, ADO, Thread (тред, нити)
    #32205962
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MsSQL:=TADOCommand.Create(nil);

и не парься
...
Рейтинг: 0 / 0
Delphi 5, ADO, Thread (тред, нити)
    #32206256
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо бы не париться....
Сделал как как подсказали, но теперь другая проблема, всё компилируется, но когда запускаю сам тред, любая команда типа:
Код: plaintext
1.
2.
3.
4.
5.
MsSQL:=TADOCommand.Create(nil);
или
MsSQL.ConnectionString:='Provider=SQLOLEDB.1;Password=xxx;Persist Security Info=False;User ID=xxx;Initial Catalog=tempdb;Data Source=x.x.x.x';
или
MsSQL.CommandText:='insert into test values (1, ''Test')';

(я их по одной в синхронизацию одавал)
выдаёт такую ошибку:
progect UiS.exe raised exeption class EOleSysError with message 'Не был произведён вызов CoInitialize'. Process stoped. Use Step or Run to continue.

Если всё это написать в отдельную процедуру work, а в самом треде сделать synchronize(work); то всё работает, но только в таком случае от треда толку никакого, опять же нет.
Как это вылечить???
...
Рейтинг: 0 / 0
Delphi 5, ADO, Thread (тред, нити)
    #32206307
Alex Alexeev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ставь в начале метода (или в конструкторе треда) CoInitialize(nil)
в конце метода (или в деструкторе треда) CoUninitialize
Обе функции декларированы в модуле ActiveX
...
Рейтинг: 0 / 0
Delphi 5, ADO, Thread (тред, нити)
    #32206394
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так как помоему правельней было бы сделать в конструкторе треда и диструкторе CoInitialize(nil) и CoUninitialize, соответственно, но эта ошибка в итоге всё равно вылетала (только если я весь код работы с базой не перенесу
в конструктор, тогда всё в порядке).
Но в итоге CoInitialize(nil) и CoUninitialize пришлось воткнуть в саму исполняемую часть треда... Почему так, почему если я инициализирую обьект в конструкторе (а он точно там инициализируется, так как я там могу с ADO работать), он не остаются инициализированным во всё время работы. Хотя вот что заметил, если я в конструкторе напишу всё тоже что и в Execute, то строка вставляется два раза, в самом конструкторе и в Execute (при этом в Execute уже ошибка о том что нет инициализации не выводится, хотя там нет CoInitialize(nil).
Вот примеры кода (рабочего и не работчего):
Это не рабочий, но помоему так правельнее, с ошибкой нет инициализации:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils, Classes, ADODb, ActiveX;
type
  MyThread = class (TThread)
     MySQL:TADOCommand;
  private
  public
     constructor Create;
     destructor Destroy; override;
  protected
     procedure Execute; override;
  end;

constructor MyThread.Create;
begin
  inherited Create(true);
  CoInitialize(nil);
  MySQL:=Tadocommand.Create(nil);
  FreeOnTerminate:=true;
  Resume;
End;

destructor MyThread.Destroy;
begin
  MySQL.free;
  MySQL:=nil;
  CoUninitialize;
End;

procedure MyThread.Execute;
begin
  MySQL.ConnectionString:='тут строчка для коннекта';   //здесь ничинается ошибка
  MySQL.CommandText:='здесь команда для вставки записи';
  MySQL.Execute;
end;

begin
  readln;
  MyThread.Create;
  readln;
end.

А вот код который работает, но не понятно почему:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils, Classes, ADODb, ActiveX;
type
  MyThread = class (TThread)
     MySQL:TADOCommand;
  private
  public
     constructor Create;
     destructor Destroy; override;
  protected
     procedure Execute; override;
  end;

constructor MyThread.Create;
begin
  inherited Create(true);
  CoInitialize(nil);
  MySQL:=Tadocommand.Create(nil);
  MySQL.ConnectionString:='тут строчка для коннекта';
  MySQL.CommandText:='здесь команда для вставки записи';
  MySQL.Execute;
  FreeOnTerminate:=true;
  Resume;
End;

destructor MyThread.Destroy;
begin
  MySQL.free;
  MySQL:=nil;
  CoUninitialize;
End;

procedure MyThread.Execute;
begin
  MySQL.ConnectionString:='тут строчка для коннекта';   //здесь уже ошибки не выдаётся, хотя точно так же как и в первом случае нет инициализации CoInitialize(nil);
  MySQL.CommandText:='здесь команда для вставки записи';
  MySQL.Execute;
end;

Обьясните почему????

begin
  readln;
  MyThread.Create;
  readln;
end.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 5, ADO, Thread (тред, нити)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]