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

Fastex
Чт 21 дек 2017 22:44
Форум: Universal Data Access Components
Тема: LastInsertId возвращает 0
Ответы: 3
Просмотры: 6655

Re: LastInsertId возвращает 0

Спасибо за помощь !
Fastex
Чт 21 дек 2017 18:15
Форум: Universal Data Access Components
Тема: Пароль Access
Ответы: 1
Просмотры: 5819

Пароль Access

Здравствуйте.
Можно ли Как-то программно определить, установлен ли пароль на файл базы данных Access?

Пробовал обрабатывать события onError у uniconnectio, Но там получается сложное взаимодействие между функциями. Хотелось бы попроще.

Ещё пробовал метод Connect() Выполнять в обработке исключения. Но исключение не срабатывает.

Есть какой-нибудь способ до вызова метода соединения узнать установлен ли пароль на файл базы данных?

Спасибо .
Fastex
Пт 15 дек 2017 15:38
Форум: Universal Data Access Components
Тема: LastInsertId возвращает 0
Ответы: 3
Просмотры: 6655

LastInsertId возвращает 0

Здравствуйте!

Пишу на C++ Builder xe
База данных MySQL

В БД есть таблицы связанные многие-ко-многим.
Например Преподаватели и Ученики. Каждый препод может обучать нескольких учеников, так же, как и все ученики могут обучаться разных преподов.

Задача состоит в том, чтобы из пользовательского интерфейса пользователь смог ввести данные преподавателя и прикрепить к этому преподавателю несколько учеников.
Проблема в том, что мне нужно знать id нового преподавателя, но запись ещё не сохранена, а выполнен только insert().

Пробую uniquery->LastInsertId: возвращает 0.
Пробовал ставить defaultvalues=true-не помогло .

Почему возвращается 0 и что можно сделать? Необходимо зарезервировать id. Что можно ещё попробовать ?
Fastex
Пн 04 дек 2017 01:34
Форум: Universal Data Access Components
Тема: Проверка введенных данных в БД при транзакции
Ответы: 3
Просмотры: 6698

Re: Проверка введенных данных в БД при транзакции

Благодарю за быстрый ответ!
Вариант с CachedUpdates очень помог.
Спасибо!
Fastex
Ср 29 ноя 2017 19:21
Форум: Universal Data Access Components
Тема: Проверка введенных данных в БД при транзакции
Ответы: 3
Просмотры: 6698

Проверка введенных данных в БД при транзакции

Здравствуйте!

Пишу на C++ Builder Embarcadero XE
Доступ к БД: UniDAC
БД: MySQL
Таблицы: InnoDB (поддерживает транзакции)

Задача: проверить введенные пользователем данные с формы. Проверить нужно на то заполнены ли обязательные поля или нет. Форм, таблиц, текстовых полей и т. д. очень много, поэтому думаю об универсальном решении.

Вот, что придумал: смотрю в Information_Schema (Columns) по именам полей их свойство IS_NULLABLE, затем смотрю введенное значение пользователем в это поле и смотрю, может ли оно быть Null или не может. Составляю список всех пустых обязательных полей и вывожу их пользователю в виде сообщения, чтоб именно их заполнил.

! На пользовательской форме используются компоненты ввода DB (DBEdit, DBComboBox и т.д.), которые подключены к нужным DataSource. Пользователь вводит данные, нажимает "Сохранить", срабатывает метод Post();

! Необходимо использовать транзакции при сохранении.

Пробовал таблицы MyISAM (не поддерживают транзакции)
Вот в, чем затык:
1. Непонятно, где хранятся данные кроме компонентов до метода Post();
Пробовал смотреть значения полей, пока открыт Insert(), но еще не сработал Post() - везде NULL, т.е. данных пока еще нет в DataSet.
2. Непонятно, какой запрос отправляется в БД (и отправляется ли вообще), если пользователь с формы вводит данные, а потом срабатывает Post()
3. Нашел предложение отключить RequiredFields у TUniQuery, отправить Post(), и посмотреть, что отправилось, но в этом случае не срабатывает RollBack() (т.к. MyISAM не поддерживает транзакции).
Вот пример:

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

procedure TForm1.UniQuery_personsBeforePost(DataSet: TDataSet);
begin
 
  If UniQuery_persons.FieldByName('family').IsNull Then  begin
  ShowMessage('Заполните поле "Фамилия"');
  abort;
  end;
  end;
4. Когда я переключился на InnoDB, то я тупо не могу выполнить Post(); пока транзакция активна.
вот что написано в у вас в документах:

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

if not UniConnection.InTransaction then
     UniConnection.StartTransaction;
   try
     // Do some actions with database. For example:
     UniSQL1.Execute;
     UniSQL2.Execute;
 
     // Commit the current transaction to reflect changes in database if no errors were raised
     UniConnection.Commit;
   except
     // Rollback all changes in database made after StartTransaction if an error was raised
     UniConnection.Rollback;
   end;
То есть в транзакции выполняются 2 запроса и потом Commit().

Вот мой код сохранения:

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

 if(!ConnectionModule->CertificationConnection->InTransaction)
        {
            ConnectionModule->CertificationConnection->StartTransaction();
            try
                {
                    TableInfo.Table->Post();
                    if(CheckNotNullable()) //Вызов функции проверки введенных полей
                        ConnectionModule->CertificationConnection->Commit();
                    else    
                        ConnectionModule->CertificationConnection->Rollback();
                }
            catch (...)
                {
                    ConnectionModule->CertificationConnection->Rollback();
                }
        }
Тут я ни Post() ни Execute() выполнить не могу, ругается на активную транзакцию, не понимаю, как это выполняется в примере у разработчика.

Вопросы:
1. Где хранятся данные введенные в компоненты, подключенные к БД до выполнения запроса?
2. Какой запрос отправляет TUniQuery к БД при методе Post() и отправляет ли вообще?
3. Как организовать транзакцию в моем случае, когда нет явного запроса, а данные введены в форму?
4. Какие есть еще идеи по моей задаче?

Заранее спасибо!