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


Автор: RetroRe 1.2.2007, 11:23
 Добрый день. У меня такой вопрос. 

Как можно проверить в Builder или это запрос, результатом которого табличка (select...), или запрос который редактирует базу (update, insert...).
Только не предлагайте проверять на вход ключевых слов.
Использую TQuery,TADOQuery. smile 


Автор: Rodman 1.2.2007, 11:29
впиши  запрос в ТADOQuery и напиши в коде
Код

ADOQuery1->Open;
ShowMessage(ADOQuery1->Fields->Fields[0]->AsString);


если все нормально откроется, то запрос корректный (возможно)...

но еще есть вариант сделать запросу Active=TRUE;, но с этим я не уверен...

Автор: RetroRe 1.2.2007, 11:47
Запрос: 
  insert into city select 1,'aaaaaaaa'
Код

QueryADO->Open();

Возникает ошибка EDatabaseError.
Я пишу:
Код

    try
        {
          QueryADO->Open();
        }
      catch (EDatabaseError&)
        {

          ShowMessage(QueryADO->Fields->Fields[0]->AsString);
        }
 
Тогда ошибка:
List index out of bounds (0)

И что делать?



Автор: Rodman 1.2.2007, 11:49
Цитата(RetroRe @  1.2.2007,  10:47 Найти цитируемый пост)
  insert into city select 1,'aaaaaaaa'

по подробнее, что ты хочешь сделать при помощи этого запроса???

то что ты написал - почти набор символов

Автор: RetroRe 1.2.2007, 11:54
Есть таблица city. Есть два поля city_id, city_Name. И запрос нормальный.
Пишу так:
Код

     QueryADO->SQL->Clear();
      QueryADO->SQL->Add("insert into city select 1,'aaaaa'");
      try
        {
          QueryADO->Open();
        }
      catch (EDatabaseError&)
        {

          ShowMessage(QueryADO->Fields->Fields[0]->AsString);
         


Автор: Anikmar 1.2.2007, 13:37
insert into city select 1,'aaaaa'
select - это имя поля? Тогда надо в кавычках - это зарезервированное слово

По идее проверить какого типа запрос можно так:
Если после команды Open свойство Active осталось true - значит запрос остался открытым и в нем есть записи. А если нет - значит он отработал. (Не проверял - чисто предположение)

Автор: Rodman 1.2.2007, 13:41
Цитата(Rodman @  1.2.2007,  10:29 Найти цитируемый пост)
но еще есть вариант сделать запросу Active=TRUE;, но с этим я не уверен... 


Цитата(Anikmar @  1.2.2007,  12:37 Найти цитируемый пост)
Если после команды Open свойство Active осталось true - значит запрос остался открытым и в нем есть записи.


все равно не могу разобрать запрос.

синтаксис запроса на добавление
Код

INSERT INTO TableName (Field1Name, Field2Name, ...) VALUES ('bb', 'bbc', ...);


но в этом запросе
Код
insert into city select 1,'aaaaa'


не понятно откуда единица, и как что такое select!!!

Автор: RetroRe 1.2.2007, 14:05
Цитата(Rodman @  1.2.2007,  13:41 Найти цитируемый пост)

все равно не могу разобрать запрос.

синтаксис запроса на добавление
Код

INSERT INTO TableName (Field1Name, Field2Name, ...) VALUES ('bb', 'bbc', ...);



но в этом запросе
Код

insert into city select 1,'aaaaa'



не понятно откуда единица, и как что такое select!!!



запрос может быть как 1 так и 2.
У таблицы сity есть два поля 
1) city_id - int 
2)city_name - text. 
И потому такой запрос 
Код

insert into city
select 1,'aaaaaa'

вставляет одну запись. [1,'aaaaaa']
А на счет Active то сейчас проверю.

Автор: RetroRe 1.2.2007, 15:30
Да Active то false, но речь не в етом.
При вызове Open возникает ошибка  EDatabaseError.
И как мне знать, что ошибка возникла именно через то что там было написано
 insert или update. Может эта ошибка возникает в других ситуациях.
И что ме тогда делать. Active тоже будет false. 

Автор: Кнопа 1.2.2007, 15:37
Насколько мне известно, есть форма:
 
1)Use a VALUES clause to specify the data values for one row: 
INSERT INTO MyTable (PriKey, Description)
       VALUES (123, 'A description of part 123.')

2)Use a SELECT subquery to specify the data values for one or more rows. 
INSERT INTO MyTable  (PriKey, Description)
       SELECT ForeignKey, Description
       FROM SomeView


А у тебя select из пустоты... Может в этом проблема?

Автор: RetroRe 1.2.2007, 15:43
Суть не в запросе.
пусть будет запрос 

Код

delete from city
where city_id = 1    
 
Проблема не в этом.

Автор: Anikmar 1.2.2007, 19:33
Так а какой тип исключения выскакивает? Просто ошибка базы данных или что-то вроде "Несовместимый тип запроса"?

Автор: RetroRe 2.2.2007, 10:18
Допустимо я напишу так:
Код

      QueryADO->SQL->Clear();
      QueryADO->SQL->Add("delete from city where city_id = 2'");
      try
        {
          QueryADO->Open();
        }
      catch (EDatabaseError&)
        {/*Чтобы не было сообщений */}
          

Все будет хорошо, ошибка не выскакивает. Но если будет какая-то другая ошибка, при которой возникает EDatabaseError, результату то никакого. И я не буду знать шо такое. Вот в чем проблема.   smile 

Автор: Rodman 2.2.2007, 10:29
RetroRe, если делаешь: INSERT, DELETE или UPDATE то лучше использовать ExecSQL, а не Open...

Автор: RetroRe 2.2.2007, 10:59
Цитата

RetroRe, если делаешь: INSERT, DELETE или UPDATE то лучше использовать ExecSQL, а не Open... 

Ну в этот список можно добавить еще много чего. Например CREATE, EXEC ... 
Не провиряти мне запрос на вход таких слов.

Автор: Texas 2.2.2007, 22:42
Первое: научись формулировать вопросы (только без обид).

Второе: как я понял ты делаешь чтото типа SQLExplorer-а, тоесть тебе нужно чтобы при выполнении запроса который ктото будет писать, не ты, при его выполнении в случае исключительной ситуации выводилось системное сообщение с кодом и описанием ошибки, поэтому ты пишешь неправильный запрос чтобы проверить обработчик ошибок, так?

Автор: Anikmar 3.2.2007, 00:54
Цитата(Texas @  2.2.2007,  22:42 Найти цитируемый пост)
поэтому ты пишешь неправильный запрос 

Да правильный там запрос - просто достаточно экзотическое использование select-а (я сначала тоже неправильно воспринял).

Мне стало интересно, я наверное час убил на поиск подходящего свойства, но не нашел.
Я искал свойство "возвращает ли запрос записи или нет"...
Думаю надо в исходник компонента залезть и посмотреть где он это отсекает....
Парсить самому, я думаю, хоть и можно, но запарно и неинтересно - ведь внутри компонента это сделано!

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