Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > База Данных


Автор: ura5 17.4.2007, 11:31
//Выбираем sql
 M_Lsab->ADOQueryLsab->SQL->LoadFromFile("Lsab2.sql");
 Str1 = M_Lsab->ADOQueryLsab->SQL->Text;
 //Выбираем куда грузить набор данных из таблицы
 M_Lsab->DataSourceLsab->DataSet = M_Lsab->ADOQueryLsab;
 //Связываем возвращаемый набор данных и визуальные компоненты
 DBGrid1->DataSource =  M_Lsab->DataSourceLsab;
 DBNavigatorSprLsab->DataSource =  M_Lsab->DataSourceLsab;
 //открываем
 M_Lsab->ADOQueryLsab->Open();

ВОПРОС:
1. Как проверить БД на пустоту и выдать при этом сообщение
2. Как проверить БД на правильность структуры (т.е. ,если вдруг поменялась структура таблицы,то мой SQL-запрос не сработает и мне при этом  надо выдать сообщение-обработать ошибку).

Я не знаю обработку ошибок .

Спасибо. 

Автор: Anikmar 17.4.2007, 11:36
1. У TADOQuery есть метод IsEmpty()
2. В достаточной мере зависит от СУБД (хотя может быть можно использовать TADOCommand - тут я не особо петрю)

Автор: ura5 17.4.2007, 15:42
 M_Lsab->ADOQueryLsab->Open();
if ( M_Lsab->ADOQueryLsab->IsEmpty())
    ShowMessage("Справочник пуст!");

Спасибо

Автор: ura5 17.4.2007, 16:14
M_Lsab->ADOQueryLsab->SQL->LoadFromFile("Lsab2.sql");

ВОПРОС:
Как проверить  существование этого запроса? Есть он или нет?
То же самое что спросить есть ли таблица или нет.

Спасибо.

Автор: Anikmar 17.4.2007, 16:24
На счет файла - легко if (FileExists("..."))

На счет таблицы - универсальный ловить исключение, если запрос не открылся или смотреть документацию БД

Автор: IgorDV 17.4.2007, 21:07
Если СУБД Oracle, то можно так проверить на существование таблиц
   
Код

 OraQuery->Close(); 
    OraQuery->SQL->Clear();
    OraQuery->SQL->Text = "select count(table_name) from user_catalog 
                          where table_type<>'SYNONYM'/*'TABLE'...*/ and table_name in ('tabl1','tabl2','tabl3','tabl4','tabl5','tabl6')"
    OraQuery->Open();
    if (OraQuery->FieldAsInteger(0)!=6)
    {
      ShowMessage("У Вас недостаточно полномочий для работы с данной программулиной. ");
      return 0;
    }
 smile 

Автор: Coala 18.4.2007, 09:53
Цитата(ura5 @  17.4.2007,  11:31 Найти цитируемый пост)
2. Как проверить БД на правильность структуры (т.е. ,если вдруг поменялась структура таблицы,то мой SQL-запрос не сработает и мне при этом  надо выдать сообщение-обработать ошибку).

Я не знаю обработку ошибок .

Код

  try {
    Query->Open();
  }
  catch (Exception &E) {
    ShowMessage(E.Message.c_str());
  }

Это - самый примитивный обработчик. 

Автор: Nat 18.4.2007, 09:58
Здравствуйте! Подскажите, пожалуйста, как проверить выполнение ADOQuery1->ExecSQL()? InEmpty() в данной ситуации не работает.

Автор: Anikmar 18.4.2007, 10:04
Цитата(Nat @  18.4.2007,  09:58 Найти цитируемый пост)
Здравствуйте! Подскажите, пожалуйста, как проверить выполнение ADOQuery1->ExecSQL()? InEmpty() в данной ситуации не работает. 

Посмотрите хелп по этой функции.
По-моему она возвращает количество обработанных записей.

Автор: Nat 18.4.2007, 10:12
Да я бы с радостью! Только у меня Builder без Help'а :( 

Автор: ura5 18.4.2007, 10:44
Спасибо за запрос.
Извините за неграммотность.Я работаю в СУБД Oracle.Но не на сколько его знаю.
Этот запрос отработал на Oracle и вернул число записей ноль.Я поставила вместо tabl1,...,tabl6 имена таблиц (TABLES).
Я не поняла что это за   /*'TABLE'...*/   Видимо,что-то здесь свое надо поставить.Не знаю что.
Помогите

Добавлено через 8 минут и 55 секунд

ВСЕ РАБОТАЕТ.СПАСИБО.

Автор: Anikmar 18.4.2007, 11:14
Цитата(Nat @  18.4.2007,  10:12 Найти цитируемый пост)
Да я бы с радостью! Только у меня Builder без Help'а :(  


Достаточно часто вижу такую проблему.

Вопрос к администрации форума: Может быть выложить арзив хелпов по билдеру на сайт? Это будет нарушением авторских прав?

Автор: Coala 18.4.2007, 12:14
Цитата(Nat @  18.4.2007,  09:58 Найти цитируемый пост)
как проверить выполнение ADOQuery1->ExecSQL()? InEmpty() в данной ситуации не работает.
И не будет! ExecSQL() - это для запросов на изменение данных, а тебе надо просто открыть запрос на выборку через
Query->Open().

Автор: Nat 18.4.2007, 13:21
Мне и надо изменить данные smile Поэтому ExecSQL и использую. А потом надо выдать сообщение, что все прошло успешно/ не прошло успешно. Какое для этого свойство Query посмотреть?

Автор: Anikmar 18.4.2007, 13:27
Хелп по функции Exec

Executes the SQL statement for the ADO query.

int __fastcall ExecSQL(void);

Description

Call ExecSQL to execute the SQL statement currently assigned to the SQL property. Use ExecSQL to execute queries that do not return a cursor to data (such as INSERT, UPDATE, DELETE, and CREATE TABLE).

ExecSQL returns an integer value reflecting the number of rows affected by the executed SQL statement.

Note:    For SELECT statements, call Open instead of ExecSQL or set the Active property to true.

To speed performance, an application should ordinarily prepare the query by setting the Prepared property to true before calling ExecSQL for the first time.


Автор: Coala 19.4.2007, 07:42
Цитата(Nat @  18.4.2007,  13:21 Найти цитируемый пост)
надо выдать сообщение, что все прошло успешно/ не прошло успешно

Код

  try {
    Query->ExecSQL();
    ShowMessage("Запрос на изменение данных выполнен ОК!");
  }
  catch (Exception &E) {
    Application->MessageBox(E.Message.c_str(), "Ошибка выполнения запроса", MB_ICONWARNING);
  }

Автор: Nat 19.4.2007, 08:22
Спасибо! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)