Hi;
It's been a long time ago, but maybe this solution might work.
The problem is that lazarus and fpc treat unicode strings differently.
If you test with a simple console application, you will see that the queries are running. The problem is somewhat related to the cwstring unit.
In my opinion, the best thing to do is to run the database part as a dynamic link library. I made a very simple example below.
Library
library mydatalink;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, parentunit, ZDataset, ZConnection, db;
function ServerCnn():Boolean cdecl;
Begin
lasterror := False;
try
SQLServerCnn := TZConnection.Create(nil);
SQLServerCnn.Protocol := 'postgresql';
SQLServerCnn.Database := 'yourdatabasename';
SQLServerCnn.User := 'usernamame';
SQLServerCnn.Password := 'password';
SQLServerCnn.HostName := 'serverip';
SQLServerCnn.Connected := True;
Result := SQLServerCnn.Connected;
Except on E : Exception do
Begin
lasterror := True;
ErrorClass := E.ClassName;
ErrorMessage := E.Message;
end;
end;
end;
function SQLrun( SQLText: String):TDataSet; cdecl;
var
sql:TZQuery;
Begin
lasterror := False;
try
sql := TZQuery.Create(SQLServerCnn);
sql.Connection := SQLServerCnn;
sql.SQL.Text := SQLText;
sql.Open;
Result := sql;
Except on E : Exception do
Begin
lasterror := True;
ErrorClass := E.ClassName;
ErrorMessage := E.Message;
Result := nil;
end;
end;
end;
function ErrorExsist():Boolean; cdecl;
Begin
Result := lasterror;
end;
function GetErrorClass():String; cdecl;
Begin
Result := ErrorClass;
end;
function GetErrorMessage():String; cdecl;
Begin
Result := ErrorMessage;
end;
exports
ServerCnn, SQLrun, ErrorExsist, GetErrorClass, GetErrorMessage;
end.
//--------------------------------------------------------------
unit parentunit;
{$mode objfpc}{$H+}
interface
uses
Classes, ZConnection;
type
{ TParentObject }
TParentObject = class(TComponent)
private
public
connected:Boolean;
constructor Create(AOwner: TComponent); override;
end;
var
ParentObj:TParentObject;
lasterror:Boolean;
ErrorClass:String;
ErrorMessage:String;
SQLServerCnn:TZConnection;
implementation
{ TParentObject }
constructor TParentObject.Create(AOwner: TComponent);
begin
inherited;
end;
end.
Note: After compiling the dynamic link library, remember to copy it to /usr/lib
Sample Application
//...
function ServerCnn():Boolean cdecl; external 'libmydatalink.so';
function SQLrun( SQLText: String):TDataSet; cdecl; external 'libmydatalink.so';
function ErrorExsist():Boolean; cdecl; external 'libmydatalink.so';
function GetErrorClass():String; cdecl; external 'libmydatalink.so';
function GetErrorMessage():String; cdecl; external 'libmydatalink.so';
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
if ServerCnn() then
ShowMessage('Connected');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DataSource1.DataSet := SQLrun('select * from testtable');
if ErrorExsist() then
Memo1.Lines.Text := GetErrorMessage();
end;
Cheers..