Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.01.09;
Скачать: [xml.tar.bz2];

Вниз

Параметры 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
11-1197381407
Elec3C
2007-12-11 16:56
2011.01.09
Запись и чтение в/из файл(-а)


15-1285273761
Юрий
2010-09-24 00:29
2011.01.09
С днем рождения ! 24 сентября 2010 пятница


2-1286912340
v_a_belousov
2010-10-12 23:39
2011.01.09
Получить все объекты на форме


15-1285218847
12
2010-09-23 09:14
2011.01.09
А сегодня довольно хорошая дата - 40444


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский