Subject Re: [firebird-support] Having error when using Embedded, not full server
Author Helen Borrie
At 08:39 AM 24/08/2007, you wrote:
>This is a real head scratcher:
>I'm developing a Win desktop system which has been using FB 1.54
>embedded in the installed base, but for my development in Delphi IDE
>(7.0) been using the full server.
>A few weeks ago started hearing from the testers that they were getting
>"RI_ID is a required field" error, when doing simple access of a tree
>node. RI_ID is the PK of the Registry Items table and I am getting that
>value from the tree node's data record which I then look up the record
>in the table via a parameterized SQL SELECT statement. All basic stuff.

This is a problem happening in your data access layer, before the
application has posted a request to the database server. Delphi
database access components usually throw this error when you try to
post an *insert* from a dataset and the value for a non-nullable
field value is missing. Is this really as "basic" as you describe,
or does your application have to create the data for the treeview's
dataset before it can select it?

>Anyway, I checked this and no problems on my system. They gave me a step
>by instructions to reproduce; still no problems on my end. Meanwhile
>they've kept having the error. Since the only difference between theirs
>and mine installation is the use of the full FB server. I turned off the
>service and ran my own local installation of the user version which uses
>the embedded. Sure enough, I got the error.

There's nothing obvious that would account for a difference in
behaviour between the embedded client and the one for server access
that is being accessed by your application on your own system. I
highly suspect that you have some artifacts hanging around there.

However, as part of your reality checks, I'd want to make sure that
the client library that your application is loading for full server
access is actually the same version as the client embedded in
fbembed.dll. The client installed by Delphi 7 is the IB 6.0 version
of the InterBase gds32.dll library. If necessary, override the one
you are loading currently.

By "necessary", I mean that, if you are using data access components
that know only to load a client library named gds32.dll from the
..\system32 directory, it might be that you need to install the
"Borland-compatible" version of fbclient.dll renamed as
gds32.dll. There is a program called instclient.exe in Firebird's
\bin directory which you can run in the command shell to overwrite
the wrong dll. (Execute the program first with no arguments to see
the help for the runtime parameters.) Make sure you do the switch
while gds32.dll is not loaded, i.e., close any programs, including
utilities, that connect to the server.

Once you have established a comparable client environment for both
models, you can start to compare apples with apples. You will be
able to ascertain whether the problem happens in the full
client/server environment -- hopefully it does and you will be able
to trace the execution.

Of particular interest will be the code around the area where you get
hold of the value for R_ID and apply it to a parameter for the Insert
request that your data access layer is refusing to post.

Of course, if the full server environment *is* ok already, and didn't
need the fix described (or it continued to behave differently even
after the fix) then you'll need to intensify the reality checks. :-)