| 
| 
 | Вопрос # 1 360/ вопрос открыт / | 
 |  Здравствуйте!прикрутил к прокту SQL базу, добавил такблицу она открывается всё нормально . добавил query чтобы из проекта едактировать и добавлять данные. и  теперь он мне ругается :"[Pascal Error] Unit1.pas(49): E2010 Incompatible types: 'string' and 'procedure, untyped pointer or untyped parameter'"
 Приложение:Переключить в обычный режим  unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ExtCtrls, ADODB, DB; type  TForm1 = class(TForm)    Label1: TLabel;    Kname: TEdit;    Label2: TLabel;    Ktel: TEdit;    Label3: TLabel;    Kadres: TEdit;    KVidJiv: TComboBox;    Label4: TLabel;    Label5: TLabel;    Knik: TEdit;    Label6: TLabel;    Edit1: TEdit;    AmbKarta: TButton;    Vakcinacii: TButton;    Image1: TImage;    bCancel: TButton;    bSave: TButton;    ADOTable1: TADOTable;    ADOConnection1: TADOConnection;    DataSource1: TDataSource;    Query: TADOQuery;    procedure bSaveClick(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1; implementation {$R *.dfm} procedure TForm1.bSaveClick(Sender: TObject);begin   Form1.Query.Close;  Form1.Query.SQL.Clear;  Form1.Query.SQL.Add('INSERT INTO klient(Key, kName, kTel, kAdres,kVidJiv,knik,Edit1) VALUES
(:Prm1, :Prm2, :Prm3, :Prm4);'); 
Form1.Query.Parameters.ParamByName('Prm1').Value:=integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);  Form1.Query.Parameters.ParamByName('Prm2').Value:=LabeledEdit2.Text;  Form1.Query.Parameters.ParamByName('Prm3').Value:=LabeledEdit1.Text;  Form1.Query.Parameters.ParamByName('Prm4').Value:=MaskEdit1.Text;  if(Form1.Query.ExecSQL=1)then   end; end.
|  |   Вопрос задал: GP_ (статус: Посетитель)Вопрос отправлен: 21 февраля 2008, 10:13
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович Здравствуйте, GP_!На такой синтаксис:
 'добавляем нового клиента' +
 Form1.Query.Close;
 кто угодно ругнётся. Уберите
 'добавляем нового клиента' +
 и всё пойдёт
 Ответ #2. Отвечает эксперт: Feniks Здравствуйте, GP_!Храмцов Денис прав. Только лучше для подстраховки перед использованием prepare делать проверку:
 
 if Prepared then 
   Unprepare
else
   Prepare;В Хелпе рекомендуют сразу после ExecSQL делать Unprepare. А вообще, я бы советовал из личного опыта, напрямую сразу "генерить" весь запрос, подставлять вместо параметров нужные значения и не использовать эти праметры. Ну это уже ваше лично дело. Желаю удачи.
 
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 21 февраля 2008, 11:35
 
 |  
 Мини-форум вопросаВсего сообщений: 1; последнее сообщение — 21 февраля 2008, 10:41; участников в обсуждении: 1. 
|   | Храмцов Денис (статус: 1-ый класс), 21 февраля 2008, 10:41 [#1]:Здравствуйте! Ваша процедура должна выглядеть примерно так 
 procedure TForm1.bSaveClick(Sender: TObject);
 begin
 with Query do
 try
 Close;
 SQL.Clear;
 Append('INSERT INTO klient (Field1, Field2,…,FieldN) VALUES (
  rm1,  rm2, …,  rmN)'); // или так, если вы заполняете все поля таблицы
 //Append('INSERT INTO klient VALUES (
  rm1,  rm2, …,  rmN)'); Prepare;
 ParamByName('Prm1').AsInteger:=ComboBox1.ItemIndex;
 // с объектом в ComboBox1 не совсем понятно, поэтому я его просто опустил
 ParamByName('Prm2').AsString:=LabeledEdit2.Text;
 …
 ParamByName('PrmN').AsString:=MaskEdit1.Text;
 ExecSQL;
 ShowMessage('Ура!');
 except
 ShowMessage('Ошибка');
 end;
 end;
 
 где
 Field1, Field2,...,FieldN -  это имена полей таблицы так как они есть в БД.
 Количество параметров должно соответствовать количеству полей и у параметров должен быть соответствующий тип.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |