![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Зависают запросы [D5, WinXP]
snake1977 © (2004-03-17 18:35:00)Главный модуль запускает несколько DLL, каждая из которых создает TDataBase, запускает нить и каждая нить выбирает данные испольюзуя TQuery.
Запросы выполняются но в один прекрасный момент виснут, причем непонятно почему и виснут в разных местах, например при
query.Open;
или
query.Next;
или
query.FieldByName('DateCr').AsString;
или вообще странно но на query.Close;
Подскажите в чем может быть проблемма???
Cobalt (2004-03-18 15:40:00) [1]а 1 ДЛЛ = 1 нить?
И ещё - попробуй в Дизайн-режиме открыть свою БД.
Тогда в SQLExplorer должен появиться псевдоним с её именем.
Попробуй там выполнить свой запрос.
И ещё - хоть один запрос выполняется (в смысле в программе)?
snake1977 (2004-03-18 15:05:00) [2]переменные создаются глобально в DLL
Ses:TSession;
Dbs:TDatabase;
Далее вызывается процедура
в которой
Var q:TQuery;
...
Begin
....
Ses:=TSession.Create(nil);
Ses.KeepConnections:=True;
Ses.SessionName:='VipSession';
Ses.ConfigMode := cmSession;
Ses.Open;
Dbs:=TDataBase.Create(nil);
Dbs.SessionName:=Ses.SessionName;
Dbs.DataBaseName:='VipDB';
Dbs.AliasName:='basa';
Dbs.Params.Append('USER NAME=');
Dbs.Params.Append('PASSWORD=');
DBs.LoginPrompt:=False;
Dbs.Connected:=true;
q:=TQuery.Create(nil);
q.DataBasename:=Dbs.DatabaseName;
q.SQL.Append('select t.* from document t');
q.open;
....
Cobalt (2004-03-18 14:56:00) [3]Знаешь что, давай-ка отлаживай свой программу (F8) и перед самым выполнением запроса смотри ВСЕ свойства своих компонентов: Dbs, q, Ses.
Также не совсем понятна область видимости этих переменных. Они объявлены в методе класса потока? или где ещё?
И где инициализируются из свойства?
snake1977 (2004-03-18 14:43:00) [4]а псевдонима VipDB и не существует, он формируется в рамках программы, существует псевдоним 'basa'
Dbs.AliasName:='basa'
Cobalt (2004-03-18 14:38:00) [5]Логично будет предположить, что псевдоним "VipDB" не существует.
Если же псевдоним существует, то попробуй открыть его в SQLExplorer и выполнить этот запрос.
snake1977 (2004-03-18 14:24:00) [6]Люююююди ну киньте какойнибудь примерчик, пожааалуйста, уже второй день вожусь с этой бедой :((
ничего не могу понять, я создаю Session присваиваю его DataBase все вроде ок, но когда открываю запрос пишет что не существует база в алиасе :(( хотя и алиас существует и таблица в нем тоже прекрасно существует. Вообщем все работает если я передаю в DLL Handle DataBase из главной прогаммы и присваиваю его новому экземпляру в DLL, но если я создаю Свою сессию в DLL, то получается что Query не открывается а выдает ошибку
snake1977 (2004-03-18 14:09:00) [7]все сделал как сказали.
вылетает с ошибкой "unknown database. alias "VipDB"";
при открытии
q:=TQuery.Create(nil);
q.DataBaseName:=DBS.Databasename;
q.SQL.Append('select t.* from documents t');
q.Open;
Vlad (2004-03-18 13:46:00) [8]
> snake1977 (18.03.04 13:35) [12]
Да, все верно Session.SessionName само генерируется автоматически, [10] - отставить.
И еще, по-моему Ses.Open не нужно, она автоматически должна открываться при открытии базы
snake1977 (2004-03-18 13:38:00) [9]а DataBasename и AliasName я не перепутал
snake1977 (2004-03-18 13:35:00) [10]Session незя присвоить это ReadOnly свойство
Vlad (2004-03-18 13:33:00) [11]Вернее, DataBaseName указывать нужно, только разберись сначала, что у тебя есть имя алиаса, а что есть DataBaseName, подозреваю ты их перепутал.
Vlad (2004-03-18 13:29:00) [12]
> snake1977 (18.03.04 13:21) [9]
Я по-моему наврал, нужно не SessionName присваивать, а Session. Ведь при AutoSessionName мы имя сессии не знаем заранее
> пишет "неизвестный алиас VipDB"
AliasName - это имя алиаса в БДЕ, DataBaseName в этом случае указывать не нужно
snake1977 (2004-03-18 13:21:00) [13]неполучается :((
делаю
Ses:=TSession.Create(nil);
Ses.KeepConnections:=True;
Ses.SessionName:='VipSession';
Ses.ConfigMode := cmSession;
Ses.Open;
Dbs:=TDataBase.Create(nil);
Dbs.SessionName:=Ses.SessionName;
Dbs.DataBaseName:='VipDB';
Dbs.AliasName:='basa';
Dbs.Params.Append('USER NAME=');
Dbs.Params.Append('PASSWORD=');
DBs.LoginPrompt:=False;
Dbs.Connected:=true;
пишет "неизвестный алиас VipDB"
Vlad (2004-03-18 13:11:00) [14]
> snake1977 (18.03.04 13:03) [6]
>пример, можно??
Пример чего ? Как создавать экземпляры классов в Дельфи ?
.
> что первым надо создавать? Session?? и как присвоить эту
> сессию в TDataBase??
Сначала в потоке создаешь экземпляр TSession, устанавливаешь AutoSessionName в True, затем, в том же потоке создаешь экземпляр TDataBase, где в проперти SessionName указываешь свою сессию
Romkin (2004-03-18 13:05:00) [15]Модуль данных создавай, сразу. В нем - TSession TDatabase & TQuery. Имя сессии автоматом присвоится
snake1977 (2004-03-18 13:03:00) [16]пример, можно??
что первым надо создавать? Session?? и как присвоить эту сессию в TDataBase??
sniknik (2004-03-18 12:46:00) [17]> Используется Pervasive
работал с семеркой через ADO (ODBC->ADO), проблем с потоками у него не было.
но вот с сессией у BDE точно будут, это уже не раз обсуждалось (ответ по такому обсуждению)
поставь AutoSessionName в труе у используемой сессии, если не используеш пора начать, так она дефаултная дается (одна и таже).
Игорь Шевченко (2004-03-18 12:20:00) [18]
> а на счет создания TSession, как его создавать, какие параметры
> надо ему устанавливать??
Уникальное имя задать
snake1977 (2004-03-18 08:20:00) [19]Используется Pervasive :) ежели кто знает такого :)
а на счет создания TSession, как его создавать, какие параметры надо ему устанавливать??
Zacho (2004-03-17 22:23:00) [20]СУБД какая ???