Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

Connect to Informix   Найти похожие ветки 

 
Хома   (2004-09-29 17:35) [0]

Уважаемые програмисты. Помогите, если знаете. Насамом деле вопроса 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), но она триальная. Нет ли у кого крякнутой?


 
sniknik ©   (2004-09-29 17:46) [1]

> выдается ошибка "Client: Missing data provider or data packet". Что могло ее вызвать?
не все заполнил в клиентском датасете
имя правайдера не указал.


 
Хома   (2004-09-30 09:56) [2]


 Connection:=TSQLConnection.Create(nil);
 qSelect:=TSQLDataSet.Create(nil);
 qUpdate:=TSQLDataSet.Create(nil);
 Provider:=TDataSetProvider.Create(nil);
 Client:=TClientDataSet.Create(nil);
 Source:=TDataSource.Create(nil);

 with Connection do begin
   ConnectionName:="InformixConnection";
   DriverName:="Informix";
   GetDriverFunc:="getSQLDriverINFORMIX";
   LibraryName:="dbexpinf.dll";
   LoginPrompt:=false;
   VendorLib:="isqlb09a.dll";
   Params.Add("DriverName=Informix");
   Params.Add("HostName=server");
   Params.Add("DataBase=db");
   Params.Add("User_Name=user");
   Params.Add("Password=pwd");
   Params.Add("Informix TransIsolation=ReadCommited");
 end;

 qSelect.NoMetadata:=true;
 qSelect.ObjectView:=true;
 qSelect.SQLConnection:=Connection;

 qUpdate.NoMetadata:=true;
 qUpdate.SQLConnection:=Connection;

 with Provider do begin
   Constraints:=true;
   DataSet:=qSelect;
   Exported:=true;
   Name:="Provider";
   Options:=[];
   ResolveToDataSet:=true;
   UpdateMode:=upWhereAll;
 end;

 with Client do begin
   AggregatesActive:=false;
   DisableStringTrim:=false;
   FetchOnDemand:=true;
   ObjectView:=true;
   PacketRecords:=-1;
   ProviderName:="Provider";
   StoreDefs:=true;
 end;

 Source.DataSet:=Client;

 qSelect.Close;
 qSelect.CommandText:=exec_sql;
 Client.Open;



Это код создания. Клиент вроде заполнил весь. Может что еще не указал? Бага вылезает на строке Client.Open;


 
sniknik ©   (2004-09-30 11:07) [3]

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

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

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


 
Sandman25 ©   (2004-09-30 11:50) [4]

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


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

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


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

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


 
sniknik ©   (2004-09-30 12:07) [7]

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


 
Sandman25 ©   (2004-09-30 12:09) [8]

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


 
sniknik ©   (2004-09-30 12:13) [9]

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

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


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

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

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


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

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

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


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

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


 
Sandman25 ©   (2004-09-30 12:48) [13]

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


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

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


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

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


 
sniknik ©   (2004-09-30 13:25) [16]

> В с 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 15:59) [17]

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


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

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


 
Sandman25 ©   (2004-09-30 16:12) [19]

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


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

:-)


 
sniknik ©   (2004-09-30 16:44) [21]

> Получилось:)!! Создаешь форму (просто 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:59) [22]

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.047 c
3-1096891982
stud
2004-10-04 16:13
2004.10.31
вопрос udf


1-1097843076
SSGuest
2004-10-15 16:24
2004.10.31
Как в DBGrid е сделать такую штуку...


14-1097424048
Голодный
2004-10-10 20:00
2004.10.31
Заработок


1-1097635783
Elman
2004-10-13 06:49
2004.10.31
Проблема с компиляцией. Прошу совета!


14-1097267206
Knight
2004-10-09 00:26
2004.10.31
Можно ли получить образ формы со всеми контролами...