![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Параметры ADOQuery,обнаружены символы за пределами инструкции SQL [D7]
Первокурсница © (2010-10-15 15:53:00)Добрый день...
На самостоятельное изучение дали тему "Применение параметров при реализации SQL-запросов". Программа должна реализовывать следующее:
* Добавлять записи в таблицу (INSERT)
* Удалять записи из таблицы (DELETE)
* Редактировать записи в таблице (UPDATE)
* Выдавать информацию о товарах из таблицы, которых на складе осталось меньше введённого количества.
И всё это исключительно с помощью параметров.
Таблица в БД у меня такая:
Поле IDCode (счётчик, первичный ключ)
Поле TovarName (текстовый)
Поле Price (числовой, двойное с плавающей точкой)
Поле Sklad (числовой, длинное целое)
Причём в методичке сказано что данные в неё вносить не нужно, это осуществится с помощью Дельфи, поэтому таблица пустая.
Ну а в Дельфи соответственно 4 ADOQuery, в каждом свои параметры.
Проблемы возникли уже на первой операции (INSERT). Параметры в запросе следующие:
* TName:
DataType - ftString
А вот Value он почему-то "не захотел" делать String, упорно ставит её OleStr. В этом я думаю и заключается проблема...
* Price:
DataType - ftFloat
Value "само по себе делается" Double и по-другому никак не хочет
* Sklad:
DataType - ftInteger
Value - Integer
В ADOQuery в свойстве SQL код:
INSERT INTO Table1 (TovarName, Price, Sklad)
Values( :TName, :Price, :Sklad);
Вот текст всей программы:
unit LAB7Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, DBGrids, DB, ADODB;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label5: TLabel;
Edit4: TEdit;
BitBtn4: TBitBtn;
ADOQuery2: TADOQuery;
DataSource2: TDataSource;
ADOQuery3: TADOQuery;
DataSource3: TDataSource;
ADOQuery4: TADOQuery;
DataSource4: TDataSource;
Edit5: TEdit;
Label6: TLabel;
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
X: integer;
implementation
{$R *.dfm}
procedure TForm1.BitBtn4Click(Sender: TObject); {инф-ия о товаре из табл.1, кот. на складе осталось меньше указанного кол-ва}
begin
ADOQuery1.Active:=false;
ADOQuery1.Parameters.ParamByName('NS').Value:=StrToInt(Edit4.Text);
ADOQuery1.Active:=true;
ADOQuery1.SQL.Add('SELECT * FROM Table1');
end;
procedure TForm1.BitBtn1Click(Sender: TObject); {Добавить записи в табл.1}
begin
ADOQuery2.Parameters.ParamByName('TName').Value:=Edit1.Text;
ADOQuery2.Parameters.ParamByName('Price').Value:=StrToFloat(Edit2.Text);
ADOQuery2.Parameters.ParamByName('Sklad').Value:=StrToInt(Edit3.Text);
ADOQuery2.ExecSQL;
ADOQuery2.SQL.Add('SELECT * FROM Table1');
end;
procedure TForm1.BitBtn3Click(Sender: TObject); {редактировать запись}
begin
ADOQuery3.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
ADOQuery3.Parameters.ParamByName('TName').Value:=Edit1.Text;
ADOQuery3.Parameters.ParamByName('Price').Value:=StrToFloat(Edit2.Text);
ADOQuery3.Parameters.ParamByName('Sklad').Value:=StrToInt(Edit3.Text);
ADOQuery3.ExecSQL;
ADOQuery3.SQL.Add('SELECT * FROM Table1');
end;
procedure TForm1.BitBtn2Click(Sender: TObject); {удалить запись}
begin
ADOQuery4.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
ADOQuery4.SQL.Add('SELECT * FROM Table1');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOQuery1.SQL.Add('SELECT * FROM Table1');
ADOQuery2.SQL.Add('SELECT * FROM Table1');
ADOQuery3.SQL.Add('SELECT * FROM Table1');
ADOQuery4.SQL.Add('SELECT * FROM Table1');
end;
end.
Запустила, вввела в Edit'ы наименование товара, цену, склад, нажимаю кнопку "Добавить" - прога вылетает с ошибкой "Обнаружены символы за пределами инструкции SQL". Ну а другие операции я даже проверить не могу пока эта не станет работать... (да и во всех остальных операциях наверняка накосячила)
Подскажите пожалуйста, как побороть эту ошибку?!
Первокурсница (2010-10-15 19:38:00) [1]
UPDATE Table1 SET TovarName=:TName, Price=:Price, Sklad=:Sklad
WHERE IDCode=:ID_Code;
Случайно пришло в голову и оказалось правильно)
Всем спасибо за участие!
Anatoly Podgoretsky (2010-10-15 19:33:00) [2]> Первокурсница (15.10.2010 19:20:10) [10]
ПОпробуй выполнить SELECT сразу после бегин
Первокурсница (2010-10-15 19:20:00) [3]Теперь осталась одна проблема - с UPDATE.
В SQL написан код:
UPDATE Table1 SET (:TName, :Price, :Sklad)
WHERE IDCode=:ID_Code;
Параметры
ID_Code
DataType - ftInteger
Value - Integer
TName
DataType - ftString
Value - OleStr
Price
DataType - ftFloat
Value - Double
Sklad
DataType - ftInteger
Value - Integer
Процедура:
procedure TForm1.BitBtn3Click(Sender: TObject); {редактировать запись}
begin
ADOQuery3.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
ADOQuery3.Parameters.ParamByName('TName').Value:=Edit1.Text;
ADOQuery3.Parameters.ParamByName('Price').Value:=StrToFloat(Edit2.Text);
ADOQuery3.Parameters.ParamByName('Sklad').Value:=StrToInt(Edit3.Text);
ADOQuery3.ExecSQL;
ADOQuery5.SQL.Text:='SELECT * FROM Table1';
AdoQuery5.Open;
end;
Ошибка - "Ошибка синтаксиса в инструкции UPDATE".
Подсвечивает строкуADOQuery5.SQL.Text:='SELECT * FROM Table1';
Ошибка ведь наверняка в UPDATE Table1 SET...., какую-нибудь запятую или скобки я там не дописала(
Anatoly Podgoretsky (2010-10-15 19:10:00) [4]> Первокурсница (15.10.2010 15:53:00) [0]
Для начало надо указать в какой строке возникает ошибка.
Первокурсница (2010-10-15 18:05:00) [5]
ADOQuery4.ExecSQL;
вместо
ADOQuery4.Active:=true;
С этим разобралась.
Первокурсница (2010-10-15 18:00:00) [6]Edit5 то есть, а не Edit4. Очепятка)
Первокурсница (2010-10-15 17:59:00) [7]Серьёзно:)
DELETE FROM Table1
WHERE IDCode=:ID_Code;
Это я записала в свойство SQL компонента ADOQuery с помощью редактора SQL-скрипта.
procedure TForm1.BitBtn2Click(Sender: TObject); {удалить запись}
begin
ADOQuery4.Active:=false;
ADOQuery4.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
ADOQuery4.Active:=true;
ADOQuery5.SQL.Text:='SELECT * FROM Table1';
ADOQuery5.Open;
end;
Это записано в обработчик события OnClick соответствующей кнопки.
ADOQuery4.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
Здесь происходит передача введённого АйДи-кода товара из компонента ввода Edit4 в параметр :ID_Code компонента ADOQuery4.
ADOQuery4.Active:=true;ъ
Здесь запускается выполнение запроса с параметром.
ADOQuery5.SQL.Text:='SELECT * FROM Table1';
ADOQuery5.Open;
Это процедура просмотра содержимого всех полей таблицы, которую (как приказывает методичка) необходимо вставлять в конце запросов INSERT,DELETE,UPDATE.
Sergey13 (2010-10-15 17:48:00) [8]> [2] Первокурсница © (15.10.10 17:02)
> Процедура INSERT работает корректно:)
Серьезно? Вы шутите?
> В процедуре DELETE нужно ввести ID_Code товара в Edit, нажать
> кнопку и товар должен исчезнуть. В ADOQuery отвечающем за
> эту процедуру SQL код:
> DELETE FROM Table1
> WHERE IDCode=:ID_Code;
Код правильный. И куда вы его записали?
> Параметр в этом запросе один:
> ID_Code:
> DataType - ftInteger
> Value - Integer
Это тоже правильно.
Дальше можете описать полет своей мысли облеченный в код?
> Процедура:
> procedure TForm1.BitBtn2Click(Sender: TObject); {удалить запись}
> begin
> ADOQuery4.Active:=false;
> ADOQuery4.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
> ADOQuery4.Active:=true;
> ADOQuery5.SQL.Text:='SELECT * FROM Table1';
> ADOQuery5.Open;
> end;
Первокурсница (2010-10-15 17:47:00) [9]О, если бы нашла бы я такое место откуда коды бы можно было бы копировать бездумно...ах мечты мечты:) К сожалению, весь этот "дерьмокод" как вы выразились я написала сама. SQL.Clear добавила. "Параметры" ставила точь-в-точь так как указано в методичке.
Плохиш (2010-10-15 17:30:00) [10]
> Первокурсница © (15.10.10 15:53)
Ни в одном показанном запросе параметров нет.
В коде много SQL.Add и нет SQL.Clear. Запросы кто за вас чистить должен, Пушкин?
> Не судите строго, я же только учусь
Враньё, нифига вы не учитесь, накопировали дерьмокода откуда-то бездумно.
Первокурсница (2010-10-15 17:02:00) [11]С procedure TForm1.FormCreate разобралась. Просто нужно было чтобы результаты операции сразу же возникали в DBGrid (в методичке сказано вызывать эту процедуру при создании формы и сразу же после запросов INSERT,DELETE,UPDATE), поместила ещё один "вспомогательный" ADOQuery, получилось:
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOQuery5.SQL.Text:='SELECT * FROM Table1';
end;
Вылетать с ошибкой перестало. Процедура INSERT работает корректно:)
Но не работают процедуры DELETE и UPDATE:(
В процедуре DELETE нужно ввести ID_Code товара в Edit, нажать кнопку и товар должен исчезнуть. В ADOQuery отвечающем за эту процедуру SQL код:
DELETE FROM Table1
WHERE IDCode=:ID_Code;
Параметр в этом запросе один:
ID_Code:
DataType - ftInteger
Value - Integer
Процедура:
procedure TForm1.BitBtn2Click(Sender: TObject); {удалить запись}
begin
ADOQuery4.Active:=false;
ADOQuery4.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
ADOQuery4.Active:=true;
ADOQuery5.SQL.Text:='SELECT * FROM Table1';
ADOQuery5.Open;
end;
Но вылетает с ошибкой "Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции".
А в процедуре UPDATE нужно опять же ввести в Edit ID_Code товара, внести в соответствующие Edit'ы наименование товара, цену и количество его на складе, нажать кнопку "Изменить" и радоваться результатам. Но результатов-то как раз-таки и нету:(
В ADOQuery отвечающем за эту процедуру SQL код:
UPDATE Table1 SET (:TName, :Price, :Sklad)
WHERE IDCode=:ID_Code;
Параметры в этом запросе:
ID_Code
DataType - ftInteger
Value - Integer
TName
DataType - ftString
Value - OleStr
Price
DataType - ftFloat
Value - Double
Sklad
DataType - ftInteger
Value - Integer
Процедура:
procedure TForm1.BitBtn3Click(Sender: TObject); {редактировать запись}
begin
ADOQuery3.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
ADOQuery3.Parameters.ParamByName('TName').Value:=Edit1.Text;
ADOQuery3.Parameters.ParamByName('Price').Value:=StrToFloat(Edit2.Text);
ADOQuery3.Parameters.ParamByName('Sklad').Value:=StrToInt(Edit3.Text);
ADOQuery3.ExecSQL;
ADOQuery5.SQL.Text:='SELECT * FROM Table1';
AdoQuery5.Open;
end;
Ошибка - "Ошибка синтаксиса в инструкции UPDATE".
А та процедура про которую Вы спрашивали тоже к счастью работает корректно, её не нужно исправлять:)
Не судите строго, я же только учусь, понятное дело что для опытного профессионала мои потуги кажутся глупыми, смешными, но что взять со студентки, увы я не мастер Дельфи:)
Sergey13 (2010-10-15 16:19:00) [12]> [0] Первокурсница © (15.10.10 15:53)
Вы совершенно справедливо пишете
> * Добавлять записи в таблицу (INSERT)
> * Удалять записи из таблицы (DELETE)
> * Редактировать записи в таблице (UPDATE)
Но что тогда означает
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> ADOQuery1.SQL.Add('SELECT * FROM Table1');
> ADOQuery2.SQL.Add('SELECT * FROM Table1');
> ADOQuery3.SQL.Add('SELECT * FROM Table1');
> ADOQuery4.SQL.Add('SELECT * FROM Table1');
> end;
Почему запросы одинаковые? И где в них по вашему параметры, с которыми вам необходимо работать?
> procedure TForm1.BitBtn4Click(Sender: TObject); {инф-ия о товаре из табл.1, кот. на складе осталось меньше указанного кол-ва}
> begin
> ADOQuery1.Active:=false;
> ADOQuery1.Parameters.ParamByName('NS').Value:=StrToInt(Edit4.Text);
> ADOQuery1.Active:=true;
> ADOQuery1.SQL.Add('SELECT * FROM Table1');
> end;
Можете по русски объяснить - что вы тут делаете в каждой строке?