Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка SQL запроса, Open или ExecSQL 
V
    Опции темы
RetroRe
Дата 1.2.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2007

Репутация: нет
Всего: нет



 Добрый день. У меня такой вопрос. 

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


PM MAIL   Вверх
Rodman
Дата 1.2.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



впиши  запрос в ТADOQuery и напиши в коде
Код

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


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

но еще есть вариант сделать запросу Active=TRUE;, но с этим я не уверен...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
RetroRe
Дата 1.2.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2007

Репутация: нет
Всего: нет



Запрос: 
  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)

И что делать?



PM MAIL   Вверх
Rodman
Дата 1.2.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



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

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

то что ты написал - почти набор символов
PM MAIL WWW Skype GTalk YIM MSN   Вверх
RetroRe
Дата 1.2.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2007

Репутация: нет
Всего: нет



Есть таблица 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);
         


PM MAIL   Вверх
Anikmar
Дата 1.2.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



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

По идее проверить какого типа запрос можно так:
Если после команды Open свойство Active осталось true - значит запрос остался открытым и в нем есть записи. А если нет - значит он отработал. (Не проверял - чисто предположение)
PM MAIL ICQ   Вверх
Rodman
Дата 1.2.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



Цитата(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!!!

PM MAIL WWW Skype GTalk YIM MSN   Вверх
RetroRe
Дата 1.2.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2007

Репутация: нет
Всего: нет



Цитата(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, 14:05
PM MAIL   Вверх
RetroRe
Дата 1.2.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2007

Репутация: нет
Всего: нет



Да Active то false, но речь не в етом.
При вызове Open возникает ошибка  EDatabaseError.
И как мне знать, что ошибка возникла именно через то что там было написано
 insert или update. Может эта ошибка возникает в других ситуациях.
И что ме тогда делать. Active тоже будет false. 
PM MAIL   Вверх
Кнопа
Дата 1.2.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 1.2.2007
Где: Москва

Репутация: нет
Всего: нет



Насколько мне известно, есть форма:
 
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 из пустоты... Может в этом проблема?

PM MAIL   Вверх
RetroRe
Дата 1.2.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2007

Репутация: нет
Всего: нет



Суть не в запросе.
пусть будет запрос 

Код

delete from city
where city_id = 1    
 
Проблема не в этом.
PM MAIL   Вверх
Anikmar
Дата 1.2.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 59



Так а какой тип исключения выскакивает? Просто ошибка базы данных или что-то вроде "Несовместимый тип запроса"?
PM MAIL ICQ   Вверх
RetroRe
Дата 2.2.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2007

Репутация: нет
Всего: нет



Допустимо я напишу так:
Код

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

Все будет хорошо, ошибка не выскакивает. Но если будет какая-то другая ошибка, при которой возникает EDatabaseError, результату то никакого. И я не буду знать шо такое. Вот в чем проблема.   smile 
PM MAIL   Вверх
Rodman
Дата 2.2.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 1
Всего: 122



RetroRe, если делаешь: INSERT, DELETE или UPDATE то лучше использовать ExecSQL, а не Open...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
RetroRe
Дата 2.2.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2007

Репутация: нет
Всего: нет



Цитата

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

Ну в этот список можно добавить еще много чего. Например CREATE, EXEC ... 
Не провиряти мне запрос на вход таких слов.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.1143 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.