Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.09;
Скачать: CL | DM;

Вниз

Параметры ADOQuery,обнаружены символы за пределами инструкции SQL   Найти похожие ветки 

 
Первокурсница ©   (2010-10-15 15:53) [0]

Добрый день...
На самостоятельное изучение дали тему "Применение параметров при реализации 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". Ну а другие операции я даже проверить не могу пока эта не станет работать... (да и во всех остальных операциях наверняка накосячила)
Подскажите пожалуйста, как побороть эту ошибку?!


 
Sergey13 ©   (2010-10-15 16:19) [1]

> [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;
Можете по русски объяснить - что вы тут делаете в каждой строке?


 
Первокурсница ©   (2010-10-15 17:02) [2]

С 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".

А та процедура про которую Вы спрашивали тоже к счастью работает корректно, её не нужно исправлять:)
Не судите строго, я же только учусь, понятное дело что для опытного профессионала мои потуги кажутся глупыми, смешными, но что взять со студентки, увы я не мастер Дельфи:)


 
Плохиш ©   (2010-10-15 17:30) [3]


> Первокурсница ©   (15.10.10 15:53)  

Ни в одном показанном запросе параметров нет.
В коде много SQL.Add и нет SQL.Clear. Запросы кто за вас чистить должен, Пушкин?

> Не судите строго, я же только учусь

Враньё, нифига вы не учитесь, накопировали дерьмокода откуда-то бездумно.


 
Первокурсница ©   (2010-10-15 17:47) [4]

О, если бы нашла бы я такое место откуда коды бы можно было бы копировать бездумно...ах мечты мечты:) К сожалению, весь этот "дерьмокод" как вы выразились я написала сама. SQL.Clear добавила. "Параметры" ставила точь-в-точь так как указано в методичке.


 
Sergey13 ©   (2010-10-15 17:48) [5]

> [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:59) [6]

Серьёзно:)
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.


 
Первокурсница ©   (2010-10-15 18:00) [7]

Edit5 то есть, а не Edit4. Очепятка)


 
Первокурсница ©   (2010-10-15 18:05) [8]

ADOQuery4.ExecSQL;
вместо
ADOQuery4.Active:=true;
С этим разобралась.


 
Anatoly Podgoretsky ©   (2010-10-15 19:10) [9]

> Первокурсница  (15.10.2010 15:53:00)  [0]

Для начало надо указать в какой строке возникает ошибка.


 
Первокурсница ©   (2010-10-15 19:20) [10]

Теперь осталась одна проблема - с 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:33) [11]

> Первокурсница  (15.10.2010 19:20:10)  [10]

ПОпробуй выполнить SELECT сразу после бегин


 
Первокурсница ©   (2010-10-15 19:38) [12]

UPDATE Table1 SET TovarName=:TName, Price=:Price, Sklad=:Sklad
WHERE IDCode=:ID_Code;

Случайно пришло в голову и оказалось правильно)
Всем спасибо за участие!



Страницы: 1 вся ветка

Текущий архив: 2011.01.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.012 c
2-1287351196
Германн
2010-10-18 01:33
2011.01.09
Caption на кнопках ToolBar


6-1233258365
LOLUIII/E
2009-01-29 22:46
2011.01.09
Сокеты вопрос!!!


4-1243760418
Nikfel
2009-05-31 13:00
2011.01.09
Как загрузить файл .res и из него брать ресурсы


2-1286734500
Askorbinka
2010-10-10 22:15
2011.01.09
ComPort ы


2-1286986134
infectioni
2010-10-13 20:08
2011.01.09
параметры куба