Найдено 217 результатов

Akella
Сб 29 фев 2020 08:54
Форум: Universal Data Access Components
Тема: пропадает значение параметра после Conditions.Add
Ответы: 5
Просмотры: 9626

Re: пропадает значение параметра после Conditions.Add

Пока создавал тестовый проект, появилась ещё одна проблема после того, как я заменил текст макроса.
И эта ошибка происходит, если включено свойство SmartFetch.
Project raised exception class EIBCError with message 'Dynamic SQL Error
SQL error code = -204
Ambiguous field name between table TYPES and table TABLE1
ID'.

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
Var
 i: integer;
begin
  UniConnection1.Connect;

  UniQuery1.close;
  UniQuery1.Conditions.Clear;

  UniQuery1.MacroByName('TYPES').Value := 'LEFT JOIN TYPES T ON T.ID = A.ID_TYPE AND T.USERNAME = :USERNAME';
  UniQuery1.ParamByName('USERNAME').AsString := 'user';


  UniQuery1.open;<<< ошибка при открытии


  UniQuery1.close;

  UniQuery1.Conditions.Add('tname', 'T.NAME = :TNAME', True);
  UniQuery1.Conditions.Enable;
  UniQuery1.ParamByName('TNAME').AsString := 'qqqq';

  UniQuery1.Conditions.Add('tname', 'T.ID > 10', True);
  Memo1.Lines.Add(UniQuery1.FinalSQL);
  UniQuery1.open;

  Memo1.Lines.Add(UniQuery1.FinalSQL);


  Memo1.Lines.Add('');
  Memo1.Lines.Add('params');
  for I := 0 to pred(UniQuery1.Params.Count) do
    Memo1.Lines.Add(UniQuery1.Params[i].Name + ' = ' + UniQuery1.Params[i].AsString);

end;
Тестовый проект я отправлю со страницы ContactForm.

Я забыл добавить, что база для Firebird 3 (UTF8).

Запрос, который выдает FinalSQL, вполне нормальный и в IBExpert ID он выполняется без ошибок

Код: Выделить всё

SELECT
  A.ID,
  A.NAME NAME_USER,
  A.REMARK

  FROM TABLE1 A
  LEFT JOIN TYPES T ON T.ID = A.ID_TYPE AND T.USERNAME = :USERNAME
Akella
Чт 27 фев 2020 14:29
Форум: Universal Data Access Components
Тема: пропадает значение параметра после Conditions.Add
Ответы: 5
Просмотры: 9626

пропадает значение параметра после Conditions.Add

Delphi Tokyo, UniDAC 8.0.1.
В UniQuery добавлено 2 условия и 2 параметра. Потом нужно закрыть датасет, добавить ещё одно условие (без параметров) и снова открыть. Проблема в том, что сразу после добавления нового условия, т.е. после "UniQuery1.Conditions.Add" пропадает значение одного параметров, при этом имена параметров/условий не пересекаются (т.е. разные).

сделал такой пример.

Код: Выделить всё

procedure SetCondVal(uniQuery: TuniQuery; const Name, Val: string);
Var
  Cond: TDACondition;
  q: integer;
  n, v: string;
begin
  Cond := uniQuery.Conditions.Find(Name);
  
// здесь значение параметра (LCDMIN) ещё на месте
  for q := 0 to pred(uniQuery.ParamCount) do
  begin
    n := uniQuery.Params[q].Name;
    v := uniQuery.Params[q].AsString;
    v := v;// для бряки
  end;

  if Assigned(Cond) then
  begin
    Cond.Value := Val;
    Cond.Enable;
  end
  else
    uniQuery.Conditions.Add(Name, Val, True);// это условие выполняется

// здесь значение параметра (LCDMIN) уже потерялось
  for q := 0 to pred(uniQuery.ParamCount) do
  begin
    n := uniQuery.Params[q].Name;
    v := uniQuery.Params[q].AsString;
    v := v;// для бряки
  end;
end;
вот 4 снимка, на них видна хронология
http://prntscr.com/r8hrbx
http://prntscr.com/r8hs9s

http://prntscr.com/r8hskj
http://prntscr.com/r8hstg

Может это поможет решить проблему.
Параметр "TYPESIDS" добавлен с помощью макроса, а проблемный параметр "LCDMIN" добавлен с помощью Conditions.Add().

Я не выполняю ни Conditions.Disable, ни Conditions.Clear, просто сразу добавляю новое условие.
По идее, параметр не должен терять свое значение. Сам параметр же не теряется.
Akella
Пт 12 июл 2019 11:48
Форум: Universal Data Access Components
Тема: Как правильно отключаться от базы и завершать работу приложения?
Ответы: 21
Просмотры: 27947

Re: Как правильно отключаться от базы и завершать работу приложения?

Было бы неплохо, если бы у датасетов было свойство, отвечающее за включение/отключение автостарта транзакций.
Akella
Пт 12 июл 2019 09:10
Форум: Universal Data Access Components
Тема: Как правильно отключаться от базы и завершать работу приложения?
Ответы: 21
Просмотры: 27947

Re: Как правильно отключаться от базы и завершать работу приложения?

Я видел, что писали, что нет соответствующих свойств, но что компоненты сами стартуют транзации, этого вроде не писали.
Akella
Пт 12 июл 2019 06:35
Форум: Universal Data Access Components
Тема: Как правильно отключаться от базы и завершать работу приложения?
Ответы: 21
Просмотры: 27947

Re: Как правильно отключаться от базы и завершать работу приложения?

Так компоненты сами автоматически стартуют транзакции? Я оказался прав?
Akella
Чт 11 июл 2019 13:07
Форум: Universal Data Access Components
Тема: AutoCommit у TUniQuery не работает
Ответы: 3
Просмотры: 10031

Re: AutoCommit у TUniQuery не работает

А так и должно быть, что свойство SpecificOptions пустое?

Код: Выделить всё

  qQueryValue := TUniQuery.Create(connNotify);
  qQueryValue.Connection := connNotify;
  qQueryValue.Transaction := transR;
  qQueryValue.UpdateTransaction := transW;
  ShowMessage(qQueryValue.SpecificOptions.Text);
При этом, если компонент "создан" визуально (кинут в DataModule), то там SpecificOptions не пустое
Akella
Чт 11 июл 2019 12:12
Форум: Universal Data Access Components
Тема: В Unidac отсутствует доступ к PostgreSQL
Ответы: 2
Просмотры: 9534

В Unidac отсутствует доступ к PostgreSQL

Не могу понять, почему здесь есть описание PostgreSQL https://www.devart.com/ru/dac.html , а меня в IDE нету провайдера?
Я что-то забыл включить при установке и нужно просто переустановить библиотеку?
Akella
Чт 11 июл 2019 07:05
Форум: Universal Data Access Components
Тема: Как правильно отключаться от базы и завершать работу приложения?
Ответы: 21
Просмотры: 27947

Re: Как правильно отключаться от базы и завершать работу приложения?

Компоненты UniDAC не содержпт свойтсв подобных Autostart transaction.

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



У меня в коде вот так:

Код: Выделить всё

      sqlExec.ParamByName('LASTNAME').AsString      := User.LastName;
      sqlExec.ParamByName('LANGUAGE_CODE').AsString := User.LanguageCode;

      try
        sqlExec.Execute;
        if sqlExec.Transaction.Active then
          sqlExec.Transaction.Commit;
Как видите, строка "sqlExec.Transaction.StartTransaction" отсутствует...
ошибок нет и данные в базу сохраняются
Akella
Ср 10 июл 2019 14:13
Форум: Universal Data Access Components
Тема: Как правильно отключаться от базы и завершать работу приложения?
Ответы: 21
Просмотры: 27947

Re: Как правильно отключаться от базы и завершать работу приложения?

Компоненты UniDAC не содержпт свойтсв подобных Autostart transaction.
Я не о наличии свойств, а о том, что компоненты сами, без моего участия стартуют транзакции.
У меня в коде вот так:

Код: Выделить всё

      sqlExec.ParamByName('LASTNAME').AsString      := User.LastName;
      sqlExec.ParamByName('LANGUAGE_CODE').AsString := User.LanguageCode;

      try
        sqlExec.Execute;
        if sqlExec.Transaction.Active then
          sqlExec.Transaction.Commit;
Как видите, строка "sqlExec.Transaction.StartTransaction" отсутствует...
ошибок нет и данные в базу сохраняются
Akella
Ср 10 июл 2019 13:51
Форум: Universal Data Access Components
Тема: AutoCommit у TUniQuery не работает
Ответы: 3
Просмотры: 10031

AutoCommit у TUniQuery не работает

У TUniQuery включен AutoCommit. А у TUniConnection - отключен.
У TUniQuery все SQL заполнены. Свойство UpdatingTable заполнено.
SQL

Код: Выделить всё

SELECT 
  MP.ID,
  MP.PARENT,
  MP.PNAME,
  MP.PTYPE,
  MP.PVAL,
  MP.IMAGEINDEX,
  MP.STATEINDEX,
  MP.TTELEGRAMUSERS_ID 
FROM TTELEGRAMMAILINGPARAM MP
SQLUpdate:

Код: Выделить всё

UPDATE TTELEGRAMMAILINGPARAM
SET
  ID = :ID, PARENT = :PARENT, TTELEGRAMUSERS_ID = :TTELEGRAMUSERS_ID, PNAME = :PNAME, PTYPE = :PTYPE, PVAL = :PVAL, IMAGEINDEX = :IMAGEINDEX, STATEINDEX = :STATEINDEX
WHERE
  ID = :Old_ID
Меняю в сетке значение какого-нибудь поля. Вижу, что изменилось, но после переоткрытия набора данных всё равно старое значение.
Обновление проходит без ошибок.
У TUniQuery 2 транзации: пишущая и читающая. Параметры пишущей: write;nowait;rec_version;read_committed, свойство IdolationLavel установлено в ilCustom.

Нужно, чтобы только у нескольких TUniQuery работал механизм AutoCommit, поэтому у TUniConnection AutoCommit отключен.

Что я ещё забыл?
Akella
Вт 09 июл 2019 12:47
Форум: Universal Data Access Components
Тема: Как правильно отключаться от базы и завершать работу приложения?
Ответы: 21
Просмотры: 27947

Re: Как правильно отключаться от базы и завершать работу приложения?

Насколько я знаю, у Firebird нет никакого механизма автоматического создания/старта транзакций.
Поэтому за старт транзакций отвечают сами компоненты доступа (UniDAC, FireDAC либо FibPlus).
Например, у FibPlus есть свойства, отвечающие за Autostart transaction. И если отключить Autostart transaction у FibPlus, то при попытке открыть датасет появляется ошибка, что нет активной транзакции.
Поэтому я искал что-то подобное и у UniDAC, но не нашёл и подумал, что Autostart transaction в библиотеке UniDAC где внутри и не управляется программистом, ну типа оно просто есть.
Akella
Вт 09 июл 2019 12:34
Форум: Universal Data Access Components
Тема: Как правильно отключаться от базы и завершать работу приложения?
Ответы: 21
Просмотры: 27947

Re: Как правильно отключаться от базы и завершать работу приложения?

Я уже разобрался.

Cоздавалось несколько одинаковых компонент типа TUniConnection, а уничтожалась в итоге только одна компонента. Поэтому и оставались активные транзакции. Непонятно только почему всегда была активная транзакция, хотя в приложении было 5-10 или больше подключений, как показывал SQL-монитор.
Akella
Вт 09 июл 2019 10:54
Форум: Universal Data Access Components
Тема: Как правильно отключаться от базы и завершать работу приложения?
Ответы: 21
Просмотры: 27947

Re: Как правильно отключаться от базы и завершать работу приложения?

В общем, судя по SQL-монитору, создавалось несколько одинаковых Connection, а уничтожалось только одно.
Akella
Вт 09 июл 2019 10:35
Форум: Universal Data Access Components
Тема: Как правильно отключаться от базы и завершать работу приложения?
Ответы: 21
Просмотры: 27947

Re: Как правильно отключаться от базы и завершать работу приложения?

Хорошо было бы, если бы в исключении было бы больше информации.
ID подключения, ID транзакции, SQL запрос(ы), чтобы можно было бы быстрее такую проблему решить