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


Автор: roman 26.1.2003, 07:20
Как написать SQL – запрос, что - бы он выполнялся при работе программы, т.е. не
писать его в свойстве “SQL” компонента “Query”? На “Delphi” я делаю так:

procedure TForm1.Button1Click(Sender: TObject);
var
search :String[10];
begin
search := Edit1.Text;

if search <> '' then
begin
with Form1.Query1 do
begin
Close;
SQL.Clear;
// New запрос
SQL.Add('SELECT Name, Surname, Groop, Predmet, Ocenka');
SQL.Add('FROM ":vedomost:vedomost.db"');
SQL.Add('WHERE');
SQL.Add('(Name = "'+ search + '")')
else DataSource1.DataSet := Table1;
SQL.Add('ORDER BY Surname');
Open;
end;
end;

// Выводим найденное
if Query1.RecordCount <> 0 then
DataSource1.DataSet := Query1
else
begin
ShowMessage('НЕТУ');
DataSource1.DataSet := Table1;
end;
end;

А как написать то же само, что – бы работало в CBuilder?

Автор: Medved 26.1.2003, 12:06
Весь твой код переводить с Delphi на C++ я не буду, так как ничего сложного тут нет.
вот, из стандартной справки билдера:

Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("Delete from Country where Name = 'Argentina'");
Query1->ExecSQL();



Автор: roman 28.1.2003, 07:01
Цитата(Pegas @ 26.1.2003, 04:06)
Весь твой код переводить с Delphi на C++ я не буду, так как ничего сложного тут нет.
вот, из стандартной справки билдера:

Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("Delete from Country where Name = 'Argentina'");
Query1->ExecSQL();

Благодарю за помощь
У меня заработало только
Query1->Open();
а не
Query1->ExecSQL();

Почему , не знаю!

Автор: Baa 28.1.2003, 18:21
Все зависит от того, какие ты действия собрался выполнять... ExecSQL используют в случаях, когда не возвращается курсор...

Цитата

Call ExecSQL to execute the SQL statement currently assigned to the SQL property. Use ExecSQL to execute queries that do not return a cursor to data (such as INSERT, UPDATE, DELETE, and CREATE TABLE).

ExecSQL returns an integer value reflecting the number of rows affected by the executed SQL statement.

Note: For SELECT statements, call Open instead of ExecSQL or set the Active property to true.

Автор: Vit 29.1.2003, 00:20
Если грубо, но более понятно то

Open для кверей типа "Select"
ExecSQL для всех остальных

Автор: roman 29.1.2003, 05:01
Цитата(Baa @ 28.1.2003, 10:21)
Все зависит от того, какие ты действия собрался выполнять... ExecSQL используют в случаях, когда не возвращается курсор...

Цитата

Call ExecSQL to execute the SQL statement currently assigned to the SQL property. Use ExecSQL to execute queries that do not return a cursor to data (such as INSERT, UPDATE, DELETE, and CREATE TABLE).

ExecSQL returns an integer value reflecting the number of rows affected by the executed SQL statement.

Note: For SELECT statements, call Open instead of ExecSQL or set the Active property to true.

А как написать вложенный запрос SQL , что бы сначала выполнялось одно условие и
тут же вместе с ним, другое ? На пример:
Выбираем предмет, и выбираем группу, и выводим список студентов этой группы с оценками по этому предмету. Что нибудь одно вывожу без проблем, а вот вместе не могу. Вот как сделать именно ДВОЙНОЙ запрос?
Вот мой код на CBuilder:

AnsiString predmet, group;
predmet = Edit1->Text;
group = Edit2->Text;
if (predmet != ' ' && group != ' ')
{
Query1->Close(); Query1->SQL->Clear();
Query1->SQL->Add("Select *");
Query1->SQL->Add("FROM ':jurnalcb:Student.DB'");
Query1->SQL->Add("WHERE");
Query1->SQL->Add("(Predmet= '" + predmet +"')");
^^^^^^^^^^^ вот здесь надо еще вставить
фильтрацию по переменной “group”
Query1->SQL->Add("ORDER BY Student");
Query1->Open();
// Выводим найденое
DataSource1->DataSet = Query1;
}

Автор: Vit 29.1.2003, 06:21
1) Приведите текст запроса который вы хотите сделать
2) Если вы хотите запустить 2 квери одним запросом типа:
SQL
Select * From MyTable1 Select * from MyTable2

То BDE такие запросы не поддерживает, а в ADO есть методы типа NextRecordset
3) Сложные квери типа
SQL
Select Count(*), a From MyTable1 Where num in (Select Num2 from MyTable2) Oreder by 1
Group by a
Having Count(*)>10

Должны выполнятся точно так же как и обычные


Автор: roman 29.1.2003, 07:56
Цитата(Vit @ 28.1.2003, 22:21)
1) Приведите текст запроса который вы хотите сделать
2) Если вы хотите запустить 2 квери одним запросом типа:
SQL
Select * From MyTable1 Select * from MyTable2

То BDE такие запросы не поддерживает, а в ADO есть методы типа NextRecordset
3) Сложные квери типа
SQL
Select Count(*), a From MyTable1 Where num in (Select Num2 from MyTable2) Oreder by 1
Group by a
Having Count(*)>10

Должны выполнятся точно так же как и обычные

т.е. как текст запроса ? Мне нужно (выше указанный код)
вывести студенов по определённому предмету(эт я умею),
ну так как смотреть несколько групп не удобно, то мне нужно тут же
выбрать из найденного студентов какоё нибудь группы. У меня всего одна таблица.

Автор: Vit 29.1.2003, 07:59
Делайте это другой кверёй.

Автор: ShAlexNik 3.2.2003, 22:56
1.
select Student, Group, Subject from Table
where Group = :Group and Subject = :Subject
Значение Group и Subject передаем как параметры TQuery через свойство Params (см. help)

2.
select Student, Group, Subject from Table
Теперь фильтруем выборку с помощью свойства TQuery->Filter (см. help)

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