[Lazarus] Porting Delphi (2007/XE5) application, how to handle ADODB?

Bo Berglund bo.berglund at gmail.com
Sat Feb 11 11:58:04 CET 2023


On Fri, 10 Feb 2023 14:00:32 +0100 (CET), Michael Van Canneyt via lazarus
<lazarus at lists.lazarus-ide.org> wrote:

>
>
>On Fri, 10 Feb 2023, Bo Berglund via lazarus wrote:
>
>> On Mon, 23 Jan 2023 09:59:14 +0100 (CET), Michael Van Canneyt via lazarus
>> <lazarus at lists.lazarus-ide.org> wrote:
>>
>>>
>>>
>>> On Mon, 23 Jan 2023, Bo Berglund via lazarus wrote:
>>>
>>>> I have a number of "older" applications developed on Windows using
>>>> Delphi7-2007-XE5, which use ADODB for database accesses.
>>>> The database is Microsoft SQLSERVER.
>>>>
>>>> Now I no longer have the old Borland software installed (issues with Windows 10
>>>> etc) so I want to port the projects to FPC/Lazarus.
>>>> I have ported some other non-database applications which (with some effort)
>>>> seems to have worked out OK.
>>>>
>>>> Now I am facing the challenge of doing it on an adodb database enabled
>>>> application and I would like to know if there is some "compatible" way of doing
>>>> it, which is described somewhere?
>>>
>>> Yes.
>>>
>>> You need to use SQLDB, and the TMSSQLConnection.
>>>
>>> See https://wiki.freepascal.org/SQLdb_Tutorial1 for a simple explanation.
>>>
>>> The page https://wiki.freepascal.org/SQLdb_Package also contains some explanations
>>> for setup.
>>>
>>> There are some other pages in the wiki.
>>>
>>> A more in-depth explanation is in the lazarus book.
>>>
>>> Or you can look at
>>>
>>> https://www.freepascal.org/~michael/articles/
>>>
>>> several articles discuss SQLDB, in particular:
>>>
>>> https://www.freepascal.org/~michael/articles/lazviddb/lazviddb.pdf
>>>
>>> That should be enough to get you started.
>>>
>>> Michael.
>>
>> Thanks!
>>
>> Almost there but not quite...
>> I am using Lazarus 2.2.4 with fpc 3.2.2 on a Windows 10 box.
>>
>> The application seems to have been converted pretty well using the Lazarus
>> Delphi Conversion function to migrate from Delphi with some extra defines
>> needing adjustments. But these have been minor considering the size of the
>> application.
>>
>> But the ADODB conversion is now halted on the TSqlQuery and TMSSQLConnection
>> items which operate so differently from ADODB...
>>
>> I added this in uses:
>>
>>  mssqlconn, //Had to add this in order to use TMSSQLConnection
>>  sqldb,
>>
>> This made the code pass the defines of the objects:
>>
>>  TAppDbHandler = class
>>  private
>>    FConn: TMSSQLConnection;  // TADOConnection;
>>    FQuery: TSQLQuery;        // TADOQuery;
>>    FDatabaseServer,
>>    FDatabase,
>>    FConnString,
>>    FDbUser,
>>    FDbPassword,
>>    FUserName,
>>    FUserPassword: string;
>>
>>
>> But next I get a lot of errors because of the differences between this and the
>> Delphi ADODB we used before.
>>
>> I got lost here...
>>
>> constructor TAppDbHandler.Create;
>> begin
>>  FConn := TMSSQLConnection.Create(NIL);   //was: TADOConnection.Create(NIL);
>>  FQuery := TSQLQuery.Create(NIL); //was: TADOQuery.Create(NIL);
>>  FQuery.Connection := FConn; //<== Triggers an error
>
>FQuery.Database:=FConn;
>
>>  FDatabaseServer :=
>> ReadRegString(HKEY_CURRENT_USER,'Software\...\AppManager','DatabaseServer','servername');
>>  FDatabase :=
>> ReadRegString(HKEY_CURRENT_USER,'Software\...\AppManager','Database','APPMANAGER');
>>  FConnString := 'Provider=SQLOLEDB.1;Persist Security Info=False;' +
>>                 'Network Library=DBMSSOCN;Data Source=' + FDatabaseServer + ';'
>> +
>>                 'Initial Catalog=' + FDatabase;
>>  FDbUser := '****';
>>  FDbPassword := '****';
>> end;
>>
>>
>> Is there some example which does not use component drag-drop and properties
>> settings in the GUI but does all of it in code towards MSSQLserver?
>
>Try this:
>
>FConn.DatabaseName:=FDatabase;
>FConn.HostName:=FDatabaseServer;
>FConn.Params.Add('Provider=SQLOLEDB.1');
>FConn.Params.Add('Persist Security Info=False');
>FConn.Params.Add('Network Library=DBMSSOCN');
>FConn.UserName:=FDbUser;
>FConn.PasswWord:=FDBPassword;
>
>it is all pretty generic. I am not sure that the Params are needed, they
>look more like some ODBC/ADO specific things. The MS-SQL connection of Free
>Pascal does not use ODBC/ADO. So I would start without the params, 
>only add them if it does not work without them.
>
>One thing: make sure your SQL server accepts TCP/IP connections. 
>You must do this in the Microsoft Management Console.
>Google is your friend there.

I found this tutorial:
https://www.streetinfo.lu/computing/lazarus/project/use_mssql.html

It is still using RAD style drag-drop of the database components...

But from it I could deduce what seems to be what is needed for my conversion.
I have set up the constructor such:

constructor TAppDbHandler.Create;
begin
  FConn  := TMSSQLConnection.Create(NIL);   //was TADOConnection.Create(NIL);
  FTrans := TSQLTransaction.Create(NIL);
  FQuery := TSQLQuery.Create(NIL); // was TADOQuery.Create(NIL);

  FConn.Transaction := FTrans;
  FTrans.DataBase := FConn;
  FQuery.Transaction := FTrans;

  FDatabaseServer :=
ReadRegString(HKEY_CURRENT_USER,'Software\Mycompany\AppManager','DatabaseServer','servername');
  FConn.HostName := FDatabaseServer;

  FDatabase :=
ReadRegString(HKEY_CURRENT_USER,'Software\Mycompany\AppManager','Database','APPMANAGER');
  FConn.DatabaseName := FDatabase;

  FDbUser := 'username';
  FDbPassword := 'userpassword';

  FConn.UserName := FDbUser;
  FConn.Password := FDbPassword;
end;

And the connection handlers:

function TAppDbHandler.OpenConnection: boolean;
begin
  try
    Result := false;
    CloseConnection;

    FConn.LoginPrompt := false;
    FConn.Open;
    Result := FConn.Connected;
  except
    //placeholder
  end;
  if not Result then
    MessageDlg('Could not connect to database!', mtError, [mbOk], 0);
end;


procedure TAppDbHandler.CloseConnection;
begin
	if FConn.Connected then
	  FConn.Close;
end;

But I have not been able to check this because now compilation stops at a
strange error regarding bitmaps...

I am using a QRcode generation unit I got from GitHub long time ago
(https://github.com/foxitsoftware/DelphiZXingQRCode)
and it deals with TBitmap but when I test compile my app I get this in the main
form code:

var
  QR_BMP_SSM: TBitMap;
  ...
begin
  ...
(!)  QR_BMP_SSM := TBitMap.Create; //<== Error here

Error messages:
Compile Project, Target: lib\x86_64-win64\AppManager.exe: Exit code 1, Errors: 2
FormAppManager.pas(410,25) Error: identifier idents no member "Create"
FormAppManager.pas(410,25) Fatal: Syntax error, ";" expected but "identifier
CREATE" found

But after some digging around I removed this error by moving Graphics to next to
last in the form pas file uses list....
Strange.


Now I have gotten the project to build so I should start debugging. 

But when I try to run it from within Lazarus (hit the green arrow button) then a
pop-up image appears:

------------------------------------------------------------------------------
Enable Dwarf 2 (-gw)?
The project does not write debug info in Dwarf format. The "FpDebug internal
Dwarf-debugger" supports only Dwarf.
[Enable Dwarf2 with sets] [Enable Dwarf2 (-gw)] [Enable Dwarf3 (-gw3) [Cancel]
------------------------------------------------------------------------------

What am I supposed to do with this?

-- 
Bo Berglund
Developer in Sweden



More information about the lazarus mailing list