Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 5, ADO, Thread (тред, нити) / 6 сообщений из 6, страница 1 из 1
11.07.2003, 15:51
    #32205867
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 5, ADO, Thread (тред, нити)
Делаю так:
Код: 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
11.07.2003, 15:53
    #32205870
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 5, ADO, Thread (тред, нити)
В дагонку:
Этот код использования ADO работает в основной програме, так что сам код точно рабочий.
...
Рейтинг: 0 / 0
11.07.2003, 16:43
    #32205962
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 5, ADO, Thread (тред, нити)
MsSQL:=TADOCommand.Create(nil);

и не парься
...
Рейтинг: 0 / 0
12.07.2003, 00:35
    #32206256
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 5, ADO, Thread (тред, нити)
Хорошо бы не париться....
Сделал как как подсказали, но теперь другая проблема, всё компилируется, но когда запускаю сам тред, любая команда типа:
Код: 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
12.07.2003, 12:22
    #32206307
Alex Alexeev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 5, ADO, Thread (тред, нити)
Ставь в начале метода (или в конструкторе треда) CoInitialize(nil)
в конце метода (или в деструкторе треда) CoUninitialize
Обе функции декларированы в модуле ActiveX
...
Рейтинг: 0 / 0
12.07.2003, 18:50
    #32206394
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 5, ADO, Thread (тред, нити)
Так как помоему правельней было бы сделать в конструкторе треда и диструкторе 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 5, ADO, Thread (тред, нити) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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