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


Автор: Папараццы 11.2.2007, 14:01
Вот решил перейти к обучению С++ Билдера...Сразу чем я заинтересовался это базы данных...Через ODBC очень легко получил доступ к MySQL (Намного легче чем MySQL++) крч всё супер было пока  я не остановился на запросах...Беру DataSource,Query,DbGrid и один Edit чтобы прозводить поиск...
Связал всё ...Потом стал  писать SQL запрос ...Точно так же как и в PHP 
Код

SELECT *  FROM sample WHERE id='value'
  
Где value присваиваю значение  EDIT ' а..
Ну как вы поняли нечего не происходит...При компиляции запрашивает пароль  на БД ..и пустая ГРИД даже в коде value = 1 пишу тоже нечего...
Как это надо производить ??
Зарание благодарен...
 
ПыСы : Стоитли учится с DEVELOPER 2006? там включён С++ кажется ...

Автор: Rodman 11.2.2007, 14:41
Код

//DataSource + DBGrid + Query надеюсь уже соединены
Query->SQL->Clear;
Query->SQL->Add("SELECT *  FROM sample WHERE id=:Prm");
Query->ParamByName("Prm")->Value=Edit1->Text;
Query->Open;

Автор: Папараццы 11.2.2007, 16:36
А эт потомучто VCL на Паскале написаны ?? Поэтому присваивание на Паскале ? Вроде понятно...

Автор: Anikmar 11.2.2007, 16:42
Цитата(Папараццы @  11.2.2007,  16:36 Найти цитируемый пост)
Поэтому присваивание на Паскале ?

Это вы про что? Какое присванивание на Паскале?
Кстати о прведенном примере. Чтобы избежать недоразумений - лучше явно преобразовать параметр в целое (там ведь поле целочисленное?):

Query->ParamByName("Prm")->Value=Edit1->Text.ToInt();


Автор: Папараццы 11.2.2007, 19:22
Спасибо  за совет...Ну преобразование в запросе идентичны также как и на Дельфи...А вот у меня есчё трабла есть такая по поводу вставки записи уже в таблицу парадокса
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Query->SQL->Clear();
 Query->SQL->Add("INSERT INTO name.db('name','surname') VALUES prm1,prm2 ");
 Query->ParamByName("prm1")->Value=Memo1->Text;
 Query->ParamByName("prm2")->Value=Memo2->Text;
 Query->Open();
}

Заявляет что не нет такой переменной prm1 ?
Да и для каждого запроса обизательно ставить по одному Query? Можно ли взять один использовать для всех...И откуда можно взять фаг по SQL  для Paradox или он такой же как и в MySQL - e ???? 
Зарание благодарен...

Автор: Anikmar 11.2.2007, 20:04
Сталкивался с такой проблемой. 
Решил ее следующм образом:
После динамического создания текста запроса я делал следующую команду:
Код

Query->Parameters->ParseSQL(Query->SQL->Text,true);


Автор: Папараццы 11.2.2007, 23:09
А что это значит ? 

Автор: Anikmar 11.2.2007, 23:20
Это заставляет компонент разобрать текст запроса и заполнить массив Parameters необходимыми значениями. Можно их заполнить самостоятельно. Этому гляку я удивился - в дезайн тайме парсится автоматом, но там видимо другая обработка. Когда запрос меняется в рунтайме компоненту видимо не хватает мозгов (разработчика), чтобы это засечь.
Так как большинство запросов я создавал в дизайн-тайме я не особо внимательно разбирался с таким глюком - просто нашел способ решения и на этом успокоился.

Кстати, встроенный хелп билдера соержит неправильный пример - если его тупо содрать, он выдает такую же ошибку.

Автор: Romikgy 11.2.2007, 23:25
Цитата(Rodman @  11.2.2007,  13:41 Найти цитируемый пост)
WHERE id=:Prm


Цитата(Папараццы @  11.2.2007,  18:22 Найти цитируемый пост)
VALUES prm1,prm2

имхо есть разница smile

Автор: Anikmar 11.2.2007, 23:42
Цитата(Romikgy @  11.2.2007,  23:25 Найти цитируемый пост)
имхо есть разница  

Не заметил, не внимательный. Но компонент реально глючит. Даже если двоеточия поставить.
По крайней мере у меня с этим были заморочки.

Добавлено @ 23:44 
Я просто проверил на таком коде (эта проблема давно возникала, поэтому просто кусочек накропал заново)
Код

    AQ_Test->Close();
    AQ_Test->SQL->Clear();
    AQ_Test->SQL->Add("SELECT * FROM TestTable WHERE Uni = :pUni");
    AQ_Test->Parameters->ParseSQL(AQ_Test->SQL->Text,true); 
    ShowMessage(AnsiString(AQ_Test->Parameters->Count));// Если предыдущей строки нет - выводит 0, с ней - все в порядке
    AQ_Test->Parameters->ParamByName("pUni")->Value = 1; // Тут ошибка если вручную не пропарсить текст запроса

Автор: Rodman 12.2.2007, 09:54
Папараццы, 
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Query->SQL->Clear();
 Query->SQL->Add("INSERT INTO name.db('name','surname') VALUES (:prm1,:prm2) ");
 Query->ParamByName("prm1")->Value=Memo1->Text;
 Query->ParamByName("prm2")->Value=Memo2->Text;
 Query->ExecSQL();
}

1. переда параметром должно стоять двоеточие..
2. скобки забыл...
3. для insert, delete, update лучше использовать ExecSQL

Автор: Папараццы 12.2.2007, 13:28
Ну вот я тоже это заметил...Понятно..Спасибо...

Автор: Rodman 12.2.2007, 13:29
ну если все понятно, пометь топик - решенным!!!

Автор: Папараццы 12.2.2007, 13:46
Не решился то вопрос уже довно только по теме уже пошли вопросы....Пусть поживёт темка ,у меня будут вопросики..А без них не бывает..  smile 

Автор: fliengster 2.5.2009, 08:16
Есть такая беда, как тогда сделать запрос с фильтрьванием типа если ты будешь вводить в Edit1->Text = "Art's";
то происходит проблема с запросом, если в запросе было введено такое..

AnsiString Name = Edit1->Text;
ADOQuery3->SQL->Add("select Table1.id,Table1.Name from Table1,Table2 where Name_Recipe = '"+Name+"'; ");
ADOQuery3->Active = true;

происходит что когда просматривается запрос получается в переменной Name встречается символ ' ....
Как мне его отфильтровать ... или каждый раз делать парсин строки ... для обнаружения этого символа и заменять на что-то другое?

Автор: Sharkfire 2.5.2009, 14:54
такие символы экранируются с помощью слеша " \ " и SQL не анализирует его как часть синтаксиса. 

Автор: fliengster 3.5.2009, 20:50
В принцепе я это знаю... но тогда нужно проводить парсинг строки .. типа если попадается символ ' тогда перед ним ставить "\"...?

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