Steps to reproduce was to switch from Aurelius Native ODBC to Unidac.
But to be honest, this might be more zen/unidac issue, i have asked from Devart forum about this ( Guid issue with Actian ZEN - Devart Forums)
One isolated case. Tdepartment_translations has singe table inheritance, in case you are wondering what's the extra parameter.
my code is simple.
var
fmanager: TObjectManager;
llist:tlist<Tdepartment_translations>;
c:tuniconnection;
icon: IDBConnection;
uq: TUniQuery;
begin
c := TUniConnection.Create(nil);
c.ProviderName := 'ODBC';
c.server := 'Driver=Pervasive ODBC Unicode Interface;dbq=kirkar;ServerName=mylaptop';
c.LoginPrompt := FALSE;
c.Connected := true;
icon := TUniDacConnectionAdapter.Create( c,'ZEN',TRUE);
icon.Connect;
uq := tuniquery.Create(nil);
uq.connection := c;
Randomize;
fmanager := TObjectManager.Create( icon );
fmanager.Explorer.Events.OnSQLExecuting.Subscribe(
procedure( args: TSQLExecutingArgs )
var
p: TDBParam;
begin
codesite.send( 'sql: ', args.sql );
for p in args.Params.ToArray do
codesite.send( '%s = %s', [ p.ParamName, VarToStr( p.ParamValue ) ] );
end );
llist := fmanager.find<Tdepartment_translations>.list;
codesite.send('Origial Item[0] = %s %s', [llist.Items[0].Id.ToString, llist.Items[0].Translation.ValueOrDefault]);
llist.Items[0].Translation := 'test'+random(999999).tostring;
fmanager.Flush;
fmanager.Free;
fmanager := TObjectManager.Create( icon );
llist := fmanager.find<Tdepartment_translations>.list;
codesite.send('After update Item[0] = %s %s', [llist.Items[0].Id.ToString, llist.Items[0].Translation.ValueOrDefault]);
ANd codesite output
sql: = SELECT A.id AS A_id, A.recordid AS A_recordid, A.languageid AS A_languageid, A.kaannos AS A_kaannos, A.tablename AS A_tablename
FROM kaannos_intavain A
WHERE A.tablename = :p_0
p_0 = PRYHMA
Origial Item[0] = {3CC90711-AC76-4209-BCF9-2677489C6644} Foobar
sql: = UPDATE kaannos_intavain SET
kaannos = :p1
WHERE id = :p_1
p1 = test842170
p_1 = {3CC90711-AC76-4209-BCF9-2677489C6644}
sql: = SELECT A.id AS A_id, A.recordid AS A_recordid, A.languageid AS A_languageid, A.kaannos AS A_kaannos, A.tablename AS A_tablename
FROM kaannos_intavain A
WHERE A.tablename = :p_0
p_0 = PRYHMA
After update Item[0] = {3CC90711-AC76-4209-BCF9-2677489C6644} Foobar
And It's not actually aurelius fault, if i put following code end of previous example (kaannos_intavain is table behind Tdepartment_translations)
uq := tuniquery.Create(nil);
uq.connection := c;
uq.SQL.Text := 'update kaannos_intavain set kaannos=:p1 where id=:p2';
uq.ParamByName('p1').AsString := 'will this work';
uq.ParamByName('p2').AsGuid:= tguid.Create( '{3CC90711-AC76-4209-BCF9-2677489C6644}');
uq.ExecSQL;
codesite.send('uq.rowsaffected', uq.rowsaffected);
uq.ParamByName('p1').AsString := 'how about this, will this work';
uq.ParamByName('p2').asstring:= '3CC90711-AC76-4209-BCF9-2677489C6644';
uq.ExecSQL;
codesite.send('uq.rowsaffected', uq.rowsaffected);
ouput is
uq.rowsaffected = 0
uq.rowsaffected = 1
and just to make sure my table structure is
CREATE TABLE "kaannos_intavain" (
"id" UNIQUEIDENTIFIER NOT NULL,
"tablename" VARCHAR(40) NOT NULL CASE,
"recordid" INTEGER,
"languageid" INTEGER DEFAULT '1',
"kaannos" NVARCHAR(256));
CREATE UNIQUE INDEX "index_0" IN DICTIONARY ON "kaannos_intavain" (
"id" );