Найдено 217 результатов
- Пт 07 авг 2020 11:04
- Форум: Universal Data Access Components
- Тема: Исключить COMPUTED BY поля для генератора запроса
- Ответы: 22
- Просмотры: 20135
Re: Исключить COMPUTED BY поля для генератора запроса
И вот еще одно поле. Оно вычисляемое и в Update/Insert оно не должно попадать
- Пт 07 авг 2020 09:04
- Форум: Universal Data Access Components
- Тема: Исключить COMPUTED BY поля для генератора запроса
- Ответы: 22
- Просмотры: 20135
Исключить COMPUTED BY поля для генератора запроса
Начало здесь.
viewtopic.php?f=26&t=26707&sid=b2a7ad1e ... 5c0827ae58
Проблема в том, что генератор запросов включает в SQL-запросы INSERT/UPDATE и некоторые COMPUTED BY поля. Вернее, в моем случае, пока только одно поле.
На картинке скрипт этого поля.
Кстати, и в design-time, в генераторе SQL это вычисляемое поле тоже попадает в SQL-запросы INSERT/UPDATE. Но в дизайне я могу с помощью клавиши Ctrl и мышки убрать выделение с этого поля.
В таблице много вычисляемых полей, но проблема только с этим.
Подскажите, по каким признакам генератор определяет, что поле - изменяемое или только для чтения?
Может перед генерацией запросов как-то пометить ненужные для INSERT/UPDATE поля?
viewtopic.php?f=26&t=26707&sid=b2a7ad1e ... 5c0827ae58
Проблема в том, что генератор запросов включает в SQL-запросы INSERT/UPDATE и некоторые COMPUTED BY поля. Вернее, в моем случае, пока только одно поле.
На картинке скрипт этого поля.
Кстати, и в design-time, в генераторе SQL это вычисляемое поле тоже попадает в SQL-запросы INSERT/UPDATE. Но в дизайне я могу с помощью клавиши Ctrl и мышки убрать выделение с этого поля.
В таблице много вычисляемых полей, но проблема только с этим.
Подскажите, по каким признакам генератор определяет, что поле - изменяемое или только для чтения?
Может перед генерацией запросов как-то пометить ненужные для INSERT/UPDATE поля?
- Пт 07 авг 2020 08:53
- Форум: Universal Data Access Components
- Тема: UniQuery-FetchRows и пагинация
- Ответы: 10
- Просмотры: 11483
Re: UniQuery-FetchRows и пагинация
И где же там "больше информации"?Stellar писал(а): ↑Чт 02 июл 2020 12:50 Больше информации о SmartFetch опции Вы можете прочитать в нашей он-лайн документации:
https://www.devart.com/unidac/docs/?dev ... ptions.htm
Наоборот - там той информации, которую написали вы здесь - вообще нет, не то чтобы "больше" :(
- Чт 06 авг 2020 12:13
- Форум: Universal Data Access Components
- Тема: Не генерируется запрос _stUpdate (GenerateSQL)
- Ответы: 28
- Просмотры: 19165
Re: Не генерируется запрос _stUpdate (GenerateSQL)
Как убрать утечки памяти?
Если я использую вышеуказанную процедуру GenSQL(), то потом, при завершении приложения я получаю сообщение:
Поэтому вопрос: как правильно уничтожить эти 4 объекта типа TDAParamsInfo которые создавались при генерации SQL-запросов?
Я отправлю тестовый пример, где воспроизводится проблема.
И ещё. Этот же тестовый пример показывает проблему со свойством SmartFetch.Enabled
Вот ссылка
https://files.dp.ua/ru/mWZ8wh6kRS
я хотел загрузить на (https://devart.com/company/contactform.html/) но не пускает сайт, пишет
Если я использую вышеуказанную процедуру GenSQL(), то потом, при завершении приложения я получаю сообщение:
Я вижу, что в коде создается 4 раза объект TDAParamsInfo.Create(TDAParamInfo), вероятно, уничтожения нет.Unexpected Memory Leak
---------------------------
This application has leaked memory. The leaks ordered by size are:
22: 2 x UnicodeString
30: 4 x CRAccess.TDAParamsInfo, 7 x UnicodeString, 2 x Unknown
38: 1 x UnicodeString
46: 4 x System.Generics.Collections.TList<System.Classes.TCollectionItem>
54: 19 x CRAccess.TDAParamInfo, 1 x UnicodeString
94: 2 x Unknown
Поэтому вопрос: как правильно уничтожить эти 4 объекта типа TDAParamsInfo которые создавались при генерации SQL-запросов?
Я отправлю тестовый пример, где воспроизводится проблема.
И ещё. Этот же тестовый пример показывает проблему со свойством SmartFetch.Enabled
Вот ссылка
https://files.dp.ua/ru/mWZ8wh6kRS
я хотел загрузить на (https://devart.com/company/contactform.html/) но не пускает сайт, пишет
"Error
Sorry, there was an error
Please report this error to support team."
- Вт 09 июн 2020 07:19
- Форум: Universal Data Access Components
- Тема: Не генерируется запрос _stUpdate (GenerateSQL)
- Ответы: 28
- Просмотры: 19165
- Чт 28 май 2020 08:26
- Форум: Universal Data Access Components
- Тема: Не генерируется запрос _stUpdate (GenerateSQL)
- Ответы: 28
- Просмотры: 19165
Re: Не генерируется запрос _stUpdate (GenerateSQL)
В общем, проблемы проявляются, если у TUniQuery включить SmartFetch.
- Ср 27 май 2020 18:37
- Форум: Universal Data Access Components
- Тема: Не генерируется запрос _stUpdate (GenerateSQL)
- Ответы: 28
- Просмотры: 19165
Re: Не генерируется запрос _stUpdate (GenerateSQL)
Ок, пришлю пример.
А поведение с именованными параметрами?
Мне так и не удалось сгенерировать запрос с именованными параметрами.
А поведение с именованными параметрами?
Мне так и не удалось сгенерировать запрос с именованными параметрами.
- Сб 23 май 2020 09:33
- Форум: Universal Data Access Components
- Тема: Не генерируется запрос _stUpdate (GenerateSQL)
- Ответы: 28
- Просмотры: 19165
Re: Не генерируется запрос _stUpdate (GenerateSQL)
На счет именованных параметров вопрос.
Подскажите ,что не так в коде?
Результаты вот такие:
вот сам основной select запрос
Еще добавлю кода:
Подскажите ,что не так в коде?
Код: Выделить всё
procedure GenSQL(UniQuery: TUniQuery; const aSelectSql: string);
begin
UniQuery.SQL.Text := aSelectSql;
UniQuery.KeyFields := 'id';
UniQuery.Open;
TDBAccessUtils.SQLGenerator(UniQuery).SubstituteParamName := False;// для генерирования запроса с именованными параметрами
UniQuery.SQLInsert.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stInsert, true);
OutputDebugString(Pwidechar(UniQuery.SQLInsert.Text));
UniQuery.SQLUpdate.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stUpdate, False);// Для Update 3й параметр = False
OutputDebugString(Pwidechar(UniQuery.SQLUpdate.Text));
UniQuery.SQLDelete.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stDelete, true);
OutputDebugString(Pwidechar(UniQuery.SQLDelete.Text));
UniQuery.SQLRefresh.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stRefresh, true);
OutputDebugString(Pwidechar(UniQuery.SQLRefresh.Text));
end;
INSERT вообще странный какой-тоDebug Output:
select id, name "назва" from OPERATION
WHERE INSERT INTO OPERATION
(ID, NAME)
VALUES
(?, ?((ID=?) OR (ID=?) OR (ID=?) OR (ID=?) OR (ID=?) OR (ID=?)) )
Debug Output:
UPDATE OPERATION
SET
ID = ?, NAME = ?
WHERE
ID = ?
Debug Output:
DELETE FROM OPERATION
WHERE
ID = ?
Debug Output:
SELECT ID AS IBC$0, NAME AS IBC$1 FROM OPERATION
WHERE
ID = ?
вот сам основной select запрос
Код: Выделить всё
select id, name "назва" from OPERATION
Еще добавлю кода:
Код: Выделить всё
qRef.Conditions.Clear;
qRef.sql.Text := 'select ' + IfThen(aFields.IsEmpty, 'id, name "назва"', aFields) + ' from ' + aTable;
qRef.SpecificOptions.Values['KeyGenerator'] := aGenerator;
qRef.SpecificOptions.Values['GeneratorMode'] := 'gmInsert';
GenSQL(qRef, qRef.sql.Text);// генерируем остальные запросы
- Пт 15 май 2020 07:09
- Форум: Universal Data Access Components
- Тема: Как правильно работать с транзакциями
- Ответы: 19
- Просмотры: 30627
Re: Как правильно работать с транзакциями
Да, разобрался уже, спасибо.
ЕМНИМ, то если у UniConnection AutoCommit отключен, то не важно в каком состоянии AutoCommit у UniQuery? Нужно всегда самому програмно подтверждать транзакцию даже если AutoCommit включен у UniQuery? Я правильно помню?
ЕМНИМ, то если у UniConnection AutoCommit отключен, то не важно в каком состоянии AutoCommit у UniQuery? Нужно всегда самому програмно подтверждать транзакцию даже если AutoCommit включен у UniQuery? Я правильно помню?
- Вс 10 май 2020 16:57
- Форум: Universal Data Access Components
- Тема: Не генерируется запрос _stUpdate (GenerateSQL)
- Ответы: 28
- Просмотры: 19165
Re: Не генерируется запрос _stUpdate (GenerateSQL)
В чем "неправильность" запросов.
запросы генерируются в виде
Но если вставить select-запрос в редактор запросов TUniQuery и нажать там кнопку Generate SQL, то сгенерируется вот такой запрос, т.е. с именованными параметрами:
Что сделать, чтобы SQL-генератор программно в runtime генерировал правильные запросы?
запросы генерируются в виде
Код: Выделить всё
INSERT INTO TABLE1
(ID, NAME)
VALUES
(?, ?)
Код: Выделить всё
INSERT INTO TABLE1
(ID, NAME)
VALUES
(:ID, :NAME)
- Вс 10 май 2020 16:53
- Форум: Universal Data Access Components
- Тема: Не генерируется запрос _stUpdate (GenerateSQL)
- Ответы: 28
- Просмотры: 19165
Не генерируется запрос _stUpdate (GenerateSQL)
все запросы генерируются, хоть и не совсем правильно, а вот запрос Update вообще пустой.
на входе в aSelectSql запрос простой: select id, name from table1
В UniQuery.Oprions включен параметр "foTableAliasAndField".
UniDAC 8.0.1, Delphi Rio.
на входе в aSelectSql запрос простой: select id, name from table1
Код: Выделить всё
procedure GenSQL(UniQuery: TUniQuery; const aSelectSql: string);
begin
UniQuery.SQL.Text := aSelectSql;
UniQuery.KeyFields := 'id';
UniQuery.Open;
UniQuery.SQLInsert.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stInsert, true);
OutputDebugString(Pwidechar(UniQuery.SQLInsert.Text));
UniQuery.SQLUpdate.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stUpdate, true);
OutputDebugString(Pwidechar(UniQuery.SQLUpdate.Text));
UniQuery.SQLDelete.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stDelete, true);
OutputDebugString(Pwidechar(UniQuery.SQLDelete.Text));
UniQuery.SQLRefresh.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stRefresh, true);
OutputDebugString(Pwidechar(UniQuery.SQLRefresh.Text));
//UniQuery.close;
end;
UniDAC 8.0.1, Delphi Rio.
- Сб 09 май 2020 22:24
- Форум: Universal Data Access Components
- Тема: Как правильно работать с транзакциями
- Ответы: 19
- Просмотры: 30627
Re: Как правильно работать с транзакциями
Теперь вопрос по СУБД Firebird 3, которая поддерживает множественные транзакции.
Как правильно управлять транзакциями вручную?
Т.е. мне надо открыть транзацию, сделать много изменений и закрыть транзакцию либо откатить все изменения, если возникла ошибка в процессе изменения.
Код: Выделить всё
var
q: TUniSQL;
begin
...
q.SQL.Text := 'update table1 set region = :region where id = :id;
q.Transaction := transSqlExec;// назначаем "пишущую" транзакцию.
q.Transaction.StartTransaction;//
запускаем цикл множественного изменения записей
for I := 0 to ...
begin
q.ParamByName()...
q.Execute;
end;
q.Transaction.Rollback;// отменяю все сделанные изменения
Почему нет отката изменения?
P.S. к UniConnection по умолчанию подключена транзакция "читающая", с параметрами: read;nowait;rec_version;read_committed
- Сб 29 фев 2020 16:44
- Форум: Universal Data Access Components
- Тема: пропадает значение параметра после Conditions.Add
- Ответы: 5
- Просмотры: 10033
Re: пропадает значение параметра после Conditions.Add
Пример для первого вопрос отправил и вот картинка
http://prntscr.com/r9ijfk
где видно, что второй параметр пуст.
http://prntscr.com/r9ijfk
где видно, что второй параметр пуст.
- Сб 29 фев 2020 16:21
- Форум: Universal Data Access Components
- Тема: Как ПРАВИЛЬНО работать с Conditions.Enable/Disable?
- Ответы: 3
- Просмотры: 9266
Re: Как ПРАВИЛЬНО работать с Conditions.Enable/Disable?
Ещё вопрос.
Нормально ли вызывать UniQuery.Conditions.Enable несколько раз подряд перед тем, как вызвать Open?
Почему такой вопрос.
Предыстория.
Есть код добавления условий с параметрами.
Как я понял, то в SQL-запрос датасета параметры попадают только после вызова UniQuery.Conditions.Enable.
Таким образом получается, что условие приходится добавлять как бы дважды. Первый раз добавляешь условие с параметром, а потом нужно ещё и параметр заполнить.
т.е. выполнить ещё одну проверку
я к тому, что было бы удобней так:
Теперь возвращаемся к вопросу про множественный вызов метода Enable. А можно ли делать так:
Нормально ли вызывать UniQuery.Conditions.Enable несколько раз подряд перед тем, как вызвать Open?
Почему такой вопрос.
Предыстория.
Есть код добавления условий с параметрами.
Код: Выделить всё
if DateTimePicker1.DateTime <> 0 then
qData.Conditions.Add('lcd_min','A.LCD >= :LCDMIN', True);
if DateTimePicker2.DateTime <> 0 then
qData.Conditions.Add('lcd_max','A.LCD <= :LCDMAX', True);
Таким образом получается, что условие приходится добавлять как бы дважды. Первый раз добавляешь условие с параметром, а потом нужно ещё и параметр заполнить.
т.е. выполнить ещё одну проверку
Код: Выделить всё
if Assigned(qData.Params.FindParam('LCDMIN')) then
qData.ParamByName('LCDMIN').AsDateTime := DateTimePicker1.DateTime;
if Assigned(qData.Params.FindParam('LCDMAX')) then
qData.ParamByName('LCDMAX').AsDateTime := DateTimePicker2.DateTime;
Код: Выделить всё
if DateTimePicker1.DateTime <> 0 then
begin
qData.Conditions.Add('lcd_min','A.LCD >= :LCDMIN', True);
qData.ParamByName('LCDMIN').AsDateTime := DateTimePicker.DateTime;
end;
Код: Выделить всё
qData.Close;
if DateTimePicker1.DateTime <> 0 then
begin
qData.Conditions.Add('lcd_min','A.LCD >= :LCDMIN', True);
UniQuery.Conditions.Enable;
qData.ParamByName('LCDMIN').AsDateTime := DateTimePicker.DateTime;
end;
if DateTimePicker2.DateTime <> 0 then
begin
qData.Conditions.Add('lcd_max','A.LCD <= :LCDMAX', True);
UniQuery.Conditions.Enable;
qData.ParamByName('LCDMAX').AsDateTime := DateTimePicker2.DateTime;
end;
UniQuery.Open;
- Сб 29 фев 2020 16:06
- Форум: Universal Data Access Components
- Тема: Как ПРАВИЛЬНО работать с Conditions.Enable/Disable?
- Ответы: 3
- Просмотры: 9266
Как ПРАВИЛЬНО работать с Conditions.Enable/Disable?
Не смог найти в справке и в документации некоторые ответы на мои вопрос. Например, как правильно использовать UniQuery.Conditions.Enable/Disable у функционала условий.
Не до конца понятно: если несколько раз добавляешь условия, то нужно ли перед этим вызывать Disable?
Достаточно ли просто того, что я вызову UniQuery.Conditions.Enable перед UniQuery.Open? Или обязательно/желательно выполнить такую проверку:
Не до конца понятно: если несколько раз добавляешь условия, то нужно ли перед этим вызывать Disable?
Достаточно ли просто того, что я вызову UniQuery.Conditions.Enable перед UniQuery.Open? Или обязательно/желательно выполнить такую проверку:
UniQuery.Conditions.Enable нужно вызывать только после построения всех условий и перед Open или Conditions.Enable нужно/можно вызывать перед началом добавления условий?UniQuery.Conditions.Count > 0 then
UniQuery.Conditions.Enable;