Форум: "Начинающим";
Текущий архив: 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