Форум: "Базы";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.033 c