С програмирование знаком мало, в основном ковырял Power Shell, но тут повилась задача, требующая графической части и простоты в работе. Решил попробовать Lazarus.
Цель:
Сделать небольшую оболочку, в которой мы задаем настройки подключения к MS SQL серверу и указываем несколько переменных, которые используются в динамическом запросе. Полученные результаты выводятся на экран, мы подправляем нужные нам строки и сохраняем результат в базу. За два дня более менее понял что к чему, посмотрел некоторые видео, получилась вот такая форма:

Накодил и отдельную форму с настройками, получилось их сохранять/читать из файла, форма подключается к базе данных и выполняет запросы, а так же выводит их в DBGrid.

Проблема:
Застрял на этапе обновления, на скрине выше видно, что нужное мне значение меняется, но как только я нажимаю обновить, мне пишут вот такую ошибку:

Подскажите, как корректно апдейтить сделанные изменения в базу?
Сам код приложения:
- Код: Выделить всё
unit MainForm;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
StdCtrls, DBGrids, DbCtrls, DBSettingsForm, mssqlconn, sqldb, db;
type
{ TMForm }
TMForm = class(TForm)
Amount: TLabel;
UpdSQL: TButton;
AmountEdit: TDBEdit;
DBNavigator1: TDBNavigator;
DBHotelText: TDBText;
DBRoomText: TDBText;
SQLQuerySample: TEdit;
EndDateSQLQuery: TEdit;
EndDate: TLabel;
Button1: TButton;
DBGrid1: TDBGrid;
BegDate: TLabel;
AmountSQLQuery: TEdit;
BeginDateSQLQuery: TEdit;
QueryResult: TDataSource;
DisconnectButton: TButton;
ConStat: TLabel;
MainMenu: TMainMenu;
MAbout: TMenuItem;
MDBSettings: TMenuItem;
MExit: TMenuItem;
MOptions: TMenuItem;
MHelp: TMenuItem;
MFile: TMenuItem;
TVDBTransaction: TSQLTransaction;
TVDBQuery: TSQLQuery;
TVDBConnection: TMSSQLConnection;
procedure Button1Click(Sender: TObject);
procedure DisconnectButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure MExitClick(Sender: TObject);
procedure MDBSettingsClick(Sender: TObject);
procedure QueryResultDataChange(Sender: TObject; Field: TField);
procedure QueryResultUpdateData(Sender: TObject);
procedure UpdSQLClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
MForm: TMForm;
implementation
{$R *.lfm}
{ TMForm }
procedure TMForm.MExitClick(Sender: TObject);
begin
Close;
end;
procedure TMForm.MDBSettingsClick(Sender: TObject);
begin
DBSForm.Show;
end;
procedure TMForm.QueryResultDataChange(Sender: TObject; Field: TField);
begin
end;
procedure TMForm.QueryResultUpdateData(Sender: TObject);
begin
end;
procedure TMForm.UpdSQLClick(Sender: TObject);
begin
TVDBQuery.UpdateSQL.Clear;
TVDBQuery.UpdateSQL.Text:='Update HotelAllotRoom SET Ammount = '+ AmountEdit.DataField + ' where Hotel = "'+DBHotelText.DataField+'"' ;
SQLQuerySample.Text:=TVDBQuery.UpdateSQL.Text
end;
procedure TMForm.FormCreate(Sender: TObject);
begin
end;
procedure TMForm.Button1Click(Sender: TObject);
begin
If TVDBConnection.Connected = False then
begin
TVDBConnection.DatabaseName:=DBSForm.DBName.Text;
TVDBConnection.HostName:=DBSForm.ServName.Text;
TVDBConnection.UserName:=DBSForm.UserName.Text;
TVDBConnection.Password:=DBSForm.Password.Text;
if TVDBConnection.DatabaseName='' then
begin
showmessage('Please fill Database Name in Options -> DB Settings');
end;
if TVDBConnection.HostName='' then
begin
showmessage('Please fill Server Address in Options -> DB Settings');
end;
if not DBSForm.EmptyUserName.Checked then
begin
if TVDBConnection.UserName='' then
begin
showmessage('Please fill User Name in Options -> DB Settings');
end;
end;
if not DBSForm.EmptyPassword.Checked then
begin
if TVDBConnection.Password = '' then
begin
showmessage('Please fill User Password in Options -> DB Settings');
end;
end;
try
TVDBConnection.Connected:=True;
ConStat.caption:='Connected!!';
TVDBQuery.Close;
TVDBQuery.SQL.Text:='SELECT Hotel, Room, Date, Amount from HotelAllotRoom WHERE Date > '''+ BeginDateSQLQuery.Text + ''' and Date < ''' + EndDateSQLQuery.Text +''' and Amount < ' + AmountSQLQuery.Text;
TVDBQuery.Open;
SQLQuerySample.Text:=TVDBQuery.SQL.Text;
except
on E: Exception do
begin
showmessage('Error connecting to database. Technical details: '+E.ClassName+'/'+E.Message);
end;
end;
end;
end;
procedure TMForm.DisconnectButtonClick(Sender: TObject);
begin
if TVDBConnection.Connected = True then
try
TVDBConnection.Connected:=False;
ConStat.caption:='Disconected :(';
finally
end;
end;
end.
Так как это проба пера, все действия завязаны на кнопку Connect, код повешанный на UpdSQLClick можно игнорировать, это неуспешные попытки.
Доп. вопрос:
Можно ли обойтись без дополнительных кнопок и автоматически апдейтить поля, измененные в DBGrid?
Любые комментарии /критика /замечания приветствуются.
Спасибо.