266 lines
8.0 KiB
ObjectPascal
266 lines
8.0 KiB
ObjectPascal
unit DbcDemoMain;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
|
Dialogs, StdCtrls, ExtCtrls, Spin, Grids;
|
|
|
|
type
|
|
TfrmDBCDemo = class(TForm)
|
|
Button1: TButton;
|
|
cobProtocol: TComboBox;
|
|
Pannel1: TPanel;
|
|
Label1: TLabel;
|
|
edtHostName: TEdit;
|
|
Label2: TLabel;
|
|
spePort: TSpinEdit;
|
|
Label3: TLabel;
|
|
edtDatabase: TEdit;
|
|
Label4: TLabel;
|
|
edtUsername: TEdit;
|
|
Label5: TLabel;
|
|
Label6: TLabel;
|
|
edtPassword: TEdit;
|
|
sgResults: TStringGrid;
|
|
Panel1: TPanel;
|
|
memSQL: TMemo;
|
|
Label7: TLabel;
|
|
Button2: TButton;
|
|
Panel2: TPanel;
|
|
Button3: TButton;
|
|
Button4: TButton;
|
|
Button5: TButton;
|
|
procedure Button1Click(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure Button2Click(Sender: TObject);
|
|
procedure Button3Click(Sender: TObject);
|
|
procedure Button4Click(Sender: TObject);
|
|
procedure sgResultsSelectCell(Sender: TObject; ACol, ARow: Integer;
|
|
var CanSelect: Boolean);
|
|
procedure sgResultsSetEditText(Sender: TObject; ACol, ARow: Integer;
|
|
const Value: String);
|
|
procedure Button5Click(Sender: TObject);
|
|
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
|
private
|
|
{ Private declarations }
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
frmDBCDemo: TfrmDBCDemo;
|
|
|
|
implementation
|
|
|
|
uses ZClasses, ZDbcIntfs, ZCompatibility,
|
|
//Only those drivers will be supported for which you load the proper unit, see below
|
|
ZDbcMySql, ZDbcInterbase6, ZDbcPostgreSql, ZDbcDBLib;
|
|
|
|
{$R *.dfm}
|
|
|
|
var
|
|
Connection: IZConnection;
|
|
ResultSet: IZResultSet;
|
|
LastRowNr: Integer;//This is to detect row nr change
|
|
InsertState: Boolean;
|
|
|
|
{**
|
|
This is just fills the protocols combobox with the available protocols
|
|
}
|
|
procedure TfrmDBCDemo.FormShow(Sender: TObject);
|
|
var
|
|
I, J: Integer;
|
|
Drivers: IZCollection;
|
|
Protocols: TStringDynArray;
|
|
begin
|
|
cobProtocol.Clear;
|
|
Drivers := DriverManager.GetDrivers;
|
|
for I := 0 to Drivers.Count - 1 do
|
|
begin
|
|
Protocols := (Drivers.Items[I] as IZDriver).GetSupportedProtocols;
|
|
for J := 0 to High(Protocols) do
|
|
cobProtocol.Items.Add(Protocols[J]);
|
|
end;
|
|
cobProtocol.Sorted := True;
|
|
end;
|
|
|
|
{**
|
|
Close the connection if active
|
|
}
|
|
procedure TfrmDBCDemo.FormClose(Sender: TObject; var Action: TCloseAction);
|
|
begin
|
|
if Assigned(Connection) then
|
|
if not Connection.IsClosed then
|
|
Connection.Close;
|
|
end;
|
|
|
|
{**
|
|
The connection is made here.
|
|
You can see how the connection string is generated and how to connect to the database.
|
|
}
|
|
procedure TfrmDBCDemo.Button1Click(Sender: TObject);
|
|
var
|
|
Url: string;
|
|
begin
|
|
if spePort.Value <> 0 then
|
|
begin
|
|
Url := Format('zdbc:%s://%s:%d/%s?UID=%s;PWD=%s', [cobProtocol.Text, edtHostName.Text,
|
|
spePort.Value, edtDatabase.Text, edtUserName.Text, edtPassword.Text]);
|
|
end
|
|
else
|
|
begin
|
|
Url := Format('zdbc:%s://%s/%s?UID=%s;PWD=%s', [cobProtocol.Text, edtHostName.Text,
|
|
edtDatabase.Text, edtUserName.Text, edtPassword.Text]);
|
|
end;
|
|
Connection := DriverManager.GetConnectionWithParams(Url, nil);
|
|
Connection.SetAutoCommit(True);
|
|
Connection.SetTransactionIsolation(tiReadCommitted);
|
|
Connection.Open;
|
|
end;
|
|
|
|
{**
|
|
A statement is executed here
|
|
If the statement returns a resultset then the resultset is loaded into the stringgrid.
|
|
There methods for access by name also, for example GetStringByName
|
|
}
|
|
procedure TfrmDBCDemo.Button2Click(Sender: TObject);
|
|
var
|
|
Statement: IZStatement;
|
|
I: Integer;
|
|
Value: string;
|
|
begin
|
|
Statement := Connection.CreateStatement;
|
|
//This is not neccesseary if you do not want to modify the data
|
|
Statement.SetResultSetConcurrency(rcUpdatable);
|
|
ResultSet := Statement.ExecuteQuery(memSQL.Text);
|
|
sgResults.RowCount := 1;
|
|
sgResults.ColCount := 1;
|
|
//Was any resultset returned?
|
|
if Assigned(ResultSet) then
|
|
begin
|
|
sgResults.ColCount := ResultSet.GetMetadata.GetColumnCount;
|
|
for I := 1 to ResultSet.GetMetadata.GetColumnCount do
|
|
sgResults.Cells[I - 1, 0] := ResultSet.GetMetadata.GetColumnName(I);
|
|
//Make a cycle for each record in the resultset
|
|
while ResultSet.Next do
|
|
begin
|
|
sgResults.RowCount := sgResults.RowCount + 1;
|
|
sgResults.FixedRows := 1;
|
|
for I := 1 to ResultSet.GetMetadata.GetColumnCount do
|
|
begin
|
|
//read out the proper value for the column
|
|
case ResultSet.GetMetadata.GetColumnType(I) of
|
|
stBoolean: if ResultSet.GetBoolean(I) then Value := 'True' else Value := 'False';
|
|
stByte: Value := IntToStr(ResultSet.GetByte(I));
|
|
stShort: Value := IntToStr(ResultSet.GetShort(I));
|
|
stInteger: Value := IntToStr(ResultSet.GetInt(I));
|
|
stLong: Value := IntToStr(ResultSet.GetLong(I));
|
|
stFloat: Value := FloatToStr(ResultSet.GetFloat(I));
|
|
stDouble: Value := FloatToStr(ResultSet.GetDouble(I));
|
|
stBigDecimal: Value := FloatToStr(ResultSet.GetBigDecimal(I));
|
|
stBytes, stBinaryStream: Value := ResultSet.GetBlob(I).GetString;
|
|
stDate: Value := DateToStr(ResultSet.GetDate(I));
|
|
stTime: Value := TimeToStr(ResultSet.GetTime(I));
|
|
stTimeStamp: Value := DateTimeToStr(ResultSet.GetTimeStamp(I));
|
|
stAsciiStream, stUnicodeStream: Value := ResultSet.GetBlob(I).GetString;
|
|
else
|
|
Value := ResultSet.GetString(I);
|
|
end;
|
|
if ResultSet.IsNull(I) then
|
|
Value := '';
|
|
sgResults.Cells[I - 1, sgResults.RowCount - 1] := Value;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmDBCDemo.sgResultsSelectCell(Sender: TObject; ACol,
|
|
ARow: Integer; var CanSelect: Boolean);
|
|
begin
|
|
if LastRowNr = AROw then
|
|
Exit;//Exit when the row nr has not changed
|
|
if Assigned(ResultSet) then
|
|
//Position the resultset to the selected row
|
|
ResultSet.MoveAbsolute(ARow);
|
|
InsertState := False;
|
|
LastRowNr := AROw;
|
|
end;
|
|
|
|
type
|
|
THackGrid = class(TStringGrid);
|
|
|
|
procedure TfrmDBCDemo.Button3Click(Sender: TObject);
|
|
begin
|
|
if Assigned(ResultSet) then
|
|
begin
|
|
if not InsertState then
|
|
begin
|
|
//Position the resultset to the selected row
|
|
ResultSet.MoveAbsolute(sgResults.Row);
|
|
LastRowNr := -1;
|
|
//Delete the selected row
|
|
ResultSet.DeleteRow;
|
|
end;
|
|
//Delete the selected row from the stringgrid
|
|
THackGrid(sgResults).DeleteRow(sgResults.Row);
|
|
end;
|
|
end;
|
|
|
|
{**
|
|
This method writes the modified data into the resultset.
|
|
Resultset also supports Updating field by name, for example UpdateStringByName
|
|
}
|
|
procedure TfrmDBCDemo.sgResultsSetEditText(Sender: TObject; ACol,
|
|
ARow: Integer; const Value: String);
|
|
begin
|
|
if Value = '' then
|
|
ResultSet.UpdateNull(ACol + 1)
|
|
else
|
|
case ResultSet.GetMetadata.GetColumnType(ACol + 1) of
|
|
stBoolean: ResultSet.UpdateBoolean(ACol + 1, UpperCase(Copy(Value, 1, 1)) = 'T');
|
|
stByte: ResultSet.UpdateByte(ACol + 1, StrToInt(Value));
|
|
stShort: ResultSet.UpdateShort(ACol + 1, StrToInt(Value));
|
|
stInteger: ResultSet.UpdateInt(ACol + 1, StrToInt(Value));
|
|
stLong: ResultSet.UpdateLong(ACol + 1, StrToInt(Value));
|
|
stFloat: ResultSet.UpdateFloat(ACol + 1, StrToFloat(Value));
|
|
stDouble: ResultSet.UpdateFloat(ACol + 1, StrToFloat(Value));
|
|
stBigDecimal: ResultSet.UpdateFloat(ACol + 1, StrToFloat(Value));
|
|
stBytes, stBinaryStream: ;
|
|
stDate: ResultSet.UpdateDate(ACol + 1, StrToDate(Value));
|
|
stTime: ResultSet.UpdateTime(ACol + 1, StrToTime(Value));
|
|
stTimeStamp: ResultSet.UpdateTimeStamp(ACol + 1, StrToDateTime(Value));
|
|
stAsciiStream, stUnicodeStream: ResultSet.UpdateString(ACol + 1, Value);
|
|
else
|
|
ResultSet.UpdateString(ACOl + 1, Value);
|
|
end;
|
|
end;
|
|
|
|
{**
|
|
Post the updates. If we are in insert status then insert otherwise update.
|
|
}
|
|
procedure TfrmDBCDemo.Button4Click(Sender: TObject);
|
|
begin
|
|
if Assigned(ResultSet) then
|
|
//Update the selected row
|
|
if InsertState then
|
|
ResultSet.InsertRow
|
|
else
|
|
ResultSet.UpdateRow;
|
|
end;
|
|
|
|
{**
|
|
Prepare for insert
|
|
}
|
|
procedure TfrmDBCDemo.Button5Click(Sender: TObject);
|
|
begin
|
|
sgResults.RowCount := sgResults.RowCount + 1;
|
|
sgResults.Row := sgResults.RowCount - 1;
|
|
sgResults.Col := 0;
|
|
ResultSet.MoveToInsertRow;
|
|
LastRowNr := sgResults.Row;
|
|
InsertState := True;
|
|
end;
|
|
|
|
end.
|