Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Выполнение ЛЮБОГО запроса


Автор: Artemon 2.2.2006, 13:31
Для выполнения любых 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()

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

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


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

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

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

Автор: Artemon 2.2.2006, 16:30
Цитата

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


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

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

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

Автор: bas 2.2.2006, 17:07
Цитата

Почему не работает 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.


Автор: Artemon 2.2.2006, 17:30
Кто-нибудь может быть уже посмотрит на кусок кода на C++Builder в первом топике.

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


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

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



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

Автор: Vit 2.2.2006, 19:47
Код

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?

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

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

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

ExecSQL().

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

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

Результатом данной инструкции будет одно действие - вставка новой записи (а то что внутри выполняеться выборка (или несколько) это на результат никак не влияет).

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