Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнение ЛЮБОГО запроса, Как так ? 
:(
    Опции темы
Artemon
Дата 2.2.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Для выполнения любых SQL запросов использовал следующую конструкцию:
Код

try
    {
    ADOQuery->SQL->Clear();
    ADOQuery->SQL->Add(StrSQL);
    ADOQuery->Open();
    }
  catch(...)
    {
    try        { ADOQuery->ExecSQL(); }
    catch(...) { return ERROR_BD_S_E; }      
   }




Вссе шло отлично до того момента, как мне захотелось выполнить следующий запрос:

INSERT INTO TMP_ARTISTS
SELECT ID_GENRE, ARTIST FROM ARTISTS
WHERE ARTIST = QueryArtists->FieldByName("ARTIST")->Value


Когда делаю запрос - в таблицу вставляются по две копии одной записи.

Я даже знаю с чем это связанно: С тем, что сначала выполняется:
ADOQuery->Open();
а затем еще и ADOQuery->ExecSQL()

Как этого избежать?



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Vit
Дата 2.2.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Или ADOQuery->Open(); - если нужен результат
или ADOQuery->ExecSQL() - если нужно выполнить действие но ничего читать не надо. Оба оператора приводят к выполнению запроса дважды




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
bas
Дата 2.2.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Artemon @ 2.2.2006, 13:31 Найти цитируемый пост)

try - catch(...)
Ловит сообщение поробуй -
Код

try
    {
    ADOQuery->SQL->Clear();
    ADOQuery->SQL->Add(StrSQL);
    ADOQuery->Open();
    }
  catch(...)  { }

PM MAIL   Вверх
Artemon
Дата 2.2.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Цитата

Или ADOQuery->Open(); - если нужен результат
или ADOQuery->ExecSQL() - если нужно выполнить действие но ничего читать не надо. Оба оператора приводят к выполнению запроса дважды


Vit, это я знаю, но как быть если запрос делает вставку в таблицу и при этом совершает выборку из другой таблицы - в этом-то и загвоздка.

Bas, конструкцию, которую ты предлагаешь - может использоваться только с операторами выборки, но не как не модификации.
Добавлено @ 16:43
Vit, я специально привел кусок кода который делает следующее:

Если мы делаем выборку - то выполняется только метод Open,
если мы вносим изменения в таблицу - то выполняется только
ExecSQL().

Это сообщение отредактировал(а) Artemon - 2.2.2006, 16:40


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
bas
Дата 2.2.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Почему не работает Query.Open(Query.ExecSQL)?
Что значит "ENoResultSet Error creating cursor handle"?

1.Query.Open возвращает результат запроса в виде курсора(Cursor).

Когда мы выполняем запрос «select * from table1» мы получаем
Набор данных (Cursor). Можете представит курсор как виртуальную таблицу, со строками и столбцами, определенными в запросе. В этом случае надо использовать Query.Open или Query.Active:=true;

2.Query.ExecSQL выполняет инструкции запроса и курсор не создается.

Если в запросах используются инструкции не создающие набор данных (курсор) – СREATE TABLE, INSERT, DELETE, UPDATE , SELECT INTO и т.д. то нужно вызывать метод ExecSQL.


PM MAIL   Вверх
Artemon
Дата 2.2.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


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

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



Кто-нибудь может быть уже посмотрит на кусок кода на C++Builder в первом топике.

Этот код не противоречит всему тому что было сказано в этой теме.


Я хочу узнать каким способом выполнить код:

INSERT INTO TMP_ARTISTS
SELECT ID_GENRE, ARTIST FROM ARTISTS
WHERE ARTIST = 'NEW ARTIST'



Ведь он сразуже выполняет и выборку (SELECT) и изменение таблицы методом INSERT.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Vit
Дата 2.2.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Код

ADOQuery->SQL->Clear();
ADOQuery->SQL->Add("INSERT INTO TMP_ARTISTS");
ADOQuery->SQL->Add("SELECT ID_GENRE, ARTIST FROM ARTISTS");
ADOQuery->SQL->Add("WHERE ARTIST = 'NEW ARTIST'");
ADOQuery->Open();


Хм... А разве я говорил что Open не может выполнить Insert?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
bas
Дата 3.2.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Artemon @ 2.2.2006, 17:30 Найти цитируемый пост)

Я хочу узнать каким способом выполнить код:

Цитата(Artemon @ 2.2.2006, 16:30 Найти цитируемый пост)

ExecSQL().

Artemon
Цитата(Artemon @ 2.2.2006, 17:30 Найти цитируемый пост)

Ведь он сразуже выполняет и выборку (SELECT) и изменение таблицы методом INSERT.

Результатом данной инструкции будет одно действие - вставка новой записи (а то что внутри выполняеться выборка (или несколько) это на результат никак не влияет).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

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

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


 




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


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

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