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

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

Connect to Informix [D7, Informix]


Страницы:   1 2

Хома ©   (2004-09-29 17:35:00) 

Уважаемые програмисты. Помогите, если знаете. Насамом деле вопроса 2 и они друг друга заменяют.
1. Использую для конекта к информиксу dbExpress (возможно не лучшый вариант, может что еще посоветуете?). Но создаю его динамически в потоке. Компоненты такие: TSQLConnection <- TSQLDataSet <- TDataSetProvider <- TClientDataSet <- TDataSource.
SQL-запрос добавляю в TSQLDataSet, а открываю TClientDataSet. Но это так, к слову для проверки. Проблема в следующем. Создаю компоненты с владельцем nil. Инициализирую по примеру компонент из палитры. Но при попытки открыть Client выдается ошибка "Client: Missing data provider or data packet". Что могло ее вызвать?
2. Есть ли какие более хорошие компоненты для доступа к Информиксу? Я слышал о IDAC (Informix Data Access Components), но она триальная. Нет ли у кого крякнутой?


Хома   (2004-09-30 16:59:00) [1]

Дейстительно работает. И правда забавно. Получается, что TSQLConnection может выступать владельцем? Странно. Но факт.
А форма в потоке - это правда как-то не правильно:) Но это первое, что пришло мне в голову. (маловато опыта видать).


sniknik   (2004-09-30 16:44:00) [2]

> Получилось:)!! Создаешь форму (просто Create(nil)). И делаешь ее предком.
тоже пробовал, форма необязательно(вообще форма в потоке... както не по себе ;) с TComponent срабатывает

procedure TDoThread.Execute;
var Cmp: TComponent;
begin
 Cmp:= TComponent.Create(nil);
 SQLConnection:= TSQLConnection.Create(Cmp);
 ...
 дальше по тексту


и даже ;о))
SQLConnection:= TSQLConnection.Create(nil);
...
SQLQuery:= TSQLQuery.Create(SQLConnection);
...
DataSetProvider:= TDataSetProvider.Create(SQLConnection);
...
ClientDataSet:= TClientDataSet.Create(SQLConnection);

работает. забавно.


Хома   (2004-09-30 16:35:00) [3]

:-)


Sandman25   (2004-09-30 16:12:00) [4]

Понятно. Слава sniknik, позор dbX.


Хома   (2004-09-30 16:07:00) [5]

Получилось:)!! Создаешь форму (просто Create(nil)). И делаешь ее предком. (потом естественно освобождаешь). И все! sniknik, ты был прав. Они без владельца не умеют. :)


Хома   (2004-09-30 15:59:00) [6]

Ну имя провайдера я задаю, а вот к сожалению поток (TThread) не может выступать в роле владельца:( Сейчас попробую создать в потоке невидимую форму и выставить ее в качестве владельца.


sniknik   (2004-09-30 13:25:00) [7]

> В с dbExpress чо-то творится:(
забавная вещь с ними. действительно. правда на IB пробовал но тоже самое получил, пока не сделал пару изменений упорно выдавало эту ошибку
вот рабочий код (что получилось, может поможет)


 SQLConnection:= TSQLConnection.Create( self);
 SQLConnection.ConnectionName:= 'IBConnection';
 SQLConnection.DriverName:= 'Interbase';
 SQLConnection.GetDriverFunc:= 'getSQLDriverINTERBASE';
 SQLConnection.LibraryName:= 'dbexpint.dll';
 SQLConnection.LoginPrompt:= false;
 SQLConnection.VendorLib:= 'gds32.dll';
 SQLConnection.Params.Add('DriverName=Interbase');
 SQLConnection.Params.Add('Database=D:\DB\CONMAN.GDB');
 SQLConnection.Params.Add('RoleName=RoleName');
 SQLConnection.Params.Add('User_Name=sysdba');
 SQLConnection.Params.Add('Password=masterkey');
 SQLConnection.Params.Add('ServerCharSet=');
 SQLConnection.Params.Add('SQLDialect=3');
 SQLConnection.Params.Add('ErrorResourceFile=');
 SQLConnection.Params.Add('LocaleCode=0000');
 SQLConnection.Params.Add('BlobSize=-1');
 SQLConnection.Params.Add('CommitRetain=False');
 SQLConnection.Params.Add('WaitOnLocks=True');
 SQLConnection.Params.Add('Interbase TransIsolation=ReadCommited');
 SQLConnection.Params.Add('Trim Char=False');

 SQLQuery:= TSQLQuery.Create( self);
 SQLQuery.SQLConnection:= SQLConnection;
 //SQLQuery.SQL.Add('SELECT * FROM CONTACTS');
 //SQLQuery.Open;

 DataSetProvider:= TDataSetProvider.Create( self);
 DataSetProvider.DataSet:= SQLQuery1;
 DataSetProvider.Options:= [poAllowCommandText];
  DataSetProvider.Name:= 'DataSetProvider';

 ClientDataSet:= TClientDataSet.Create( self);
 ClientDataSet.ProviderName:= 'DataSetProvider';
 ClientDataSet.CommandText:= 'SELECT * FROM CONTACTS';

 DataSource1.DataSet:= ClientDataSet;
 ClientDataSet.Open;


в общемто похоже он без предка не работает (nil), и имя провайдера ему необходимо, изменение одного из этого дает ошибку.
попробуй у себя nil на self поменять.


Хома   (2004-09-30 13:11:00) [8]

Да и видать dbx прохо поддерживает многопоточность:(


Хома   (2004-09-30 13:07:00) [9]

А есть ли какие free/cracked компоненты для доступа к Informix? А то чувствую, что с dbx я еще намучаюсь:( А время-то поджимает:)


Sandman25   (2004-09-30 12:48:00) [10]

Насколько я знаю, только они. Ну и еще Borland'овские, конечно.


Хома   (2004-09-30 12:36:00) [11]

Ааа. Вот у меня тоже с ними фигня. А dbx драйвера только они (Luxena) делают? Или можно где нибудь еще найти?


Sandman25   (2004-09-30 12:31:00) [12]

[10] Хома   (30.09.04 12:18)

Я писал именно о dbExpress.


Хома   (2004-09-30 12:18:00) [13]

2 sniknik:
Попытался, поменял, все также и осталось:( И к томуже, на сколько мне известно, TSQLQuery однонаправленный набор. А тут набор потом связывается с гридом. Т.ч. однонаправленный ни как не подходит:(

2 Sandman25:
У меня получалось получать данные в неглавном. Но только на BDE и InterBase компонентах. В с dbExpress чо-то творится:(


sniknik   (2004-09-30 12:13:00) [14]

> что Connection name in use.
при создании делай Connection.Name:= ''; помогает, это когда несколько создается, по умолчанию у них одно имя получается.

> Я вот подумал, что может будет все в норме, если все компоненты создавать в потоке. Все свойства задаю также, и появляется выше
> указанная проблема.
теоретически да, должно быть. и даже так правильней если хотя бы часть в потоке (синхронизации не нужно)
и у меня так работает (в потоке со всеми созданными компанентами), но используется ADO компаненты а не dbExpress.


Sandman25   (2004-09-30 12:09:00) [15]

Я как-то для самообразования пробовал получить данные в неглавном потоке, но, промучившись около часа, бросил.


sniknik   (2004-09-30 12:07:00) [16]

кстати напомнил, именно с dbExpress была какаято проблема в компаненте TSQLDataSet заменил на TSQLQuery и все прошло. (к сожалению не помню что было, чтото связанное с передачей параметра/запроса через TDataSetProvider)
попробуй тоже поменять, может и тебе поможет, попытайся хотябы ;о)).


Хома   (2004-09-30 12:04:00) [17]

Вот именно. Платные. А есть у кого крякнутые? Я слышал, что IDAC (ихний же) тоже хорош, но он и стоит.


Хома   (2004-09-30 12:02:00) [18]

Ну что лишнего я это понимаю:) Я же говорил, что в тупую перенял из палитры компонентов (не не все конечно, а почти). Фишка такая, что у меня компаненты и были накиданы на форму (DataModule). Работали, но только если запрос запускать из главного потока (с формы). А нужно запускать из потока. Если запускать из потока так же как и из главной формы, то выдается ошибка, что Connection name in use.
Я вот подумал, что может будет все в норме, если все компоненты создавать в потоке. Все свойства задаю также, и появляется выше указанная проблема.


Sandman25   (2004-09-30 11:50:00) [19]

Хорошие dbExpress драйвера есть на http://www.luxena.comТолько они платные.


sniknik   (2004-09-30 11:07:00) [20]

> Может что еще не указал?
может это и не касается баги, но так будет лучше помоему

Provider.Options:= [poAllowCommandText];
и
Client.Close;
Client.CommandText:=exec_sql;
Client.Open;

конкретно по баге, ну собери ты всю конструкцию на форме из компанент в дезигн тайм, и проверь. добьешся чтобы по установке активе в клиенте данные передавались и переноси все как есть. а тут  у тебя по моему лишнего задается.


Страницы:   1 2

Наверх

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