UIB+Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

UIB+Lazarus

Сообщение VAshot » 01.11.2007 13:25:11

При выполнении запроса TrendDataSet.Open, заданного по умолчанию, всё работает нормально.

Но при переопределении запроса к БД:

Код: Выделить всё
    TrendQuery: TJvUIBQuery;
    TrendDataSource: TDatasource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    TrendDataSet: TFBDataSet;
    TrendDataBase: TJvUIBDataBase;
    JvUIBTrRead: TJvUIBTransaction;
    JvUIBTrWrite: TJvUIBTransaction;

procedure TViewForm.SetQuery(sT: String);
begin
   TrendQuery.SQL.Clear;
   TrendQuery.SQL.Add('SELECT * FROM '+ sT);
   TrendQuery.ExecSQL;
end;

procedure TViewForm.ExecQuery;
begin
   TrendDataSet.CloseOpen;
   TrendDataSet.QuerySelect.SQL := TrendQuery.SQL;
   TrendDataSet.Open;
end;


всё выполняется, но после закрытия программы, происходит ошибка.
"External SIGSEGV"

Подскажите, пожалуйста, где ошибка, может что-то забыл выполнить?


Win2k, Lazarus 0.922, firebird 2.0.3
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

Сообщение Сергей Смирнов » 01.11.2007 15:02:46

Может тут ошибка:

TrendDataSet.QuerySelect.SQL := TrendQuery.SQL;

Стринглисты присваивать просто так опасно, надо копировать.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение Attid » 01.11.2007 15:05:07

везде.

TrendQuery.SQL.Clear;
TrendQuery.SQL.Add('SELECT * FROM '+ sT);
TrendQuery.ExecSQL;

зачем тебе ExecSQL если ты там селект написал ? он для инсертов или апдейтов.

TrendDataSet.CloseOpen;
TrendDataSet.QuerySelect.SQL := TrendQuery.SQL;

сначало переоткрываешь, а потом запрос меняешь ? =)
не больно самому себе на йаца наступать, а потом бежать ? =)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Attid » 01.11.2007 15:06:15

Сергей Смирнов писал(а):Может тут ошибка:

TrendDataSet.QuerySelect.SQL := TrendQuery.SQL;

Стринглисты присваивать просто так опасно, надо копировать.


угу как минимум

Код: Выделить всё
TrendDataSet.QuerySelect.SQL.text := TrendQuery.SQL.text;
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение VAshot » 01.11.2007 15:10:58

Пробовал и так:

Код: Выделить всё
    TrendDataSet.Close;
    TrendDataSet.QuerySelect.SQL.Text := 'SELECT * FROM Material';
    TrendDataSet.Open;


Тот же результат, сами запросы на отображение работают, но при закрытии программы ошибка, если не менять запрос, то завершение программы происходит нормально.
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

Сообщение Attid » 01.11.2007 15:24:16

еслиб из-за этого ошибка былаб, была бы она сразу, пробуй

Код: Выделить всё
TrendDataSet.QuerySelect.SQL.text := TrendQuery.SQL.text;


у тебя скорее всего при твоем способе указатель идет на другой обьект, при закрытии он уничтожается 2 раза, и дает AV, а в памяти еще другой остается.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение alexs » 01.11.2007 23:28:17

А зачем хакерством занимаешся? в потроха набора лезиш. Оставь дырку - обязательно найдётся те, кто этим воспользуется :( . Я абсолютно не для этого QuerySelect публичным делал, чтобы напрямую в него запрос писали.
Для заполнения запроса предназначено свойство
TrendDataSet.SQLSelect
т.е. твой код должен выглядеть так:
Код: Выделить всё
TrendDataSet.Close;
    TrendDataSet.SQLSelect.Text := 'SELECT * FROM Material';
    TrendDataSet.Open;

а ошибка происходит потому что при твоём подходе ты нарушеш весь механизм расшифровки макросов. Вот оно и рубится. Если интересно - посмотри исходники.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Сергей Смирнов » 02.11.2007 00:05:05

alexs писал(а):А зачем хакерством занимаешся? в потроха набора лезиш. Оставь дырку - обязательно найдётся те, кто этим воспользуется :( .
Сам виноват - понаплодил пропертей - у народа глаза разбегаются :D
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение alexs » 02.11.2007 00:26:07

Дык я их специально публишед не далал, чтобы в инспекторе не видно было :-)
думал спрячутся :-)
p.s.
Там сейчас Саша Литягин начал что-то делать насчёт прикручиванию уникодов, я к нему тоже скоро наверное присоеденюсь (вроде время должно появиться), так что если всё пойдёт как хочется - будет нормальная работа с уникодами - меня в этом больше всего интересует нормальная работа с UTF8.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение VAshot » 02.11.2007 08:39:19

2 alexs

Спасибо.




Вот такой вопрос возник: доки и обзорные сравнения различных компонент для БД есть где-нибудь в сети? Например, в чем плюсы/минусы UIB и FIBL (ну кроме SQL Editor)?
Устроит ответ "Ищи", если, конечно, есть что искать.
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

Сообщение Сергей Смирнов » 02.11.2007 11:25:35

VAshot писал(а):Вот такой вопрос возник: доки и обзорные сравнения различных компонент для БД есть где-нибудь в сети? Например, в чем плюсы/минусы UIB и FIBL (ну кроме SQL Editor)?
Устроит ответ "Ищи", если, конечно, есть что искать.
Документации-то толком на компоненты нету, а Вы хотите сравнения :)
Ну, если в 2-х словах, то отличия UIB и FIBL такие:
* UIB потокобезопасен (не всегда это актуально)
* UIB богаче по составу (есть компоненты по управлению пользователями, подписка на события и т.п.)
* Для UIB есть датасет, сделанный Алексеем, который вполне приближается по функционалу к FIB+, включая работу с двумя транзакциями
* UIB поддерживает практически все версии и птички и интербейс
* FIBL заметно слабее функционально, но зато и проще
* В FIBL несколько иначе реализована работа с параметрами, в т.ч. для master-detail

Наверняка чего-то забыл :)
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение Brainenjii » 02.11.2007 12:46:34

Мне в FIBL не понравилось, что Field[x].AsString не вытаскивает строки из blob'a, хотя SUB_TYPE у поля прописан как TEXT... UIB не пробовал даже, хотя управление пользователями - это гут, надо будет поставить ^_^ Сам пользуюсь FBLIB - он строки вытаскивает и не приходится возиться с параметрами, удобно ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Attid » 02.11.2007 15:00:13

Наверняка чего-то забыл


самое главное, чем больше фич тем больше верояность ошибки =)
сегодня новую нашел =) пошел жаловаться.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение alexs » 02.11.2007 15:13:02

это точно :-(
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

StoredProc

Сообщение VAshot » 21.11.2007 15:32:14

Не подскажите, как правильно использовать JvUIBStoredProc?
(с параметрами)

Код: Выделить всё
FBDataSet1.Transaction.StartTransaction;

JvUIBStoredProc1.StoredProcName:='NPR';
JvUIBStoredProc1.SelectProc:=true;

[b]
JvUIBStoredProc1.Params.ByNameAsInteger['I1']:=6;
.....
[/b]

JvUIBStoredProc1.Prepare; 
JvUIBStoredProc1.ExecProc;

FBDataSet1.Transaction.Commit;
FBDataSet1.Active:=true;


или нужно использовать SQL поле?

Код: Выделить всё
JvUIBStoredProc1.SQL.Close;
JvUIBStoredProc1.SQL.Text:='execute procedure npr (:I1)';



Вопросы, наверное, глупые, но это моя первая реализация интерфейса.
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 38

Рейтинг@Mail.ru