[fpc-pascal] MSSQL and ftAutoInc: FPC 2.6.5 changes the behavior of 2.6.2 but AutoInc not works yet

Marcos Douglas md at delfire.net
Thu Apr 24 16:13:12 CEST 2014


Hi,

I'm using 2.6.5 (fixes_2_6) now but something broke between 2.6.2 and
2.6.5 using AutoInc fields.
AutoInc never worked well (at least for MSSQL) and because that I have
my own "Query" [1] that implements AutoInc values very well.

I override the ApplyRecUpdate method from TSQLQuery and update the
AutoInc field getting the value in DB using FLib.GetLastAutoIncValue
method that, for MSSQL, I use "select scope_identity() as id" (see
code below)

The problem is to use Field.SetData to put a value. If the field is
AutoInc it is ReadOnly too and I got a exception:
      Edit;
      Fields[I].SetData(@LastId);
      Post;

But in 2.6.2 version it worked.

I need to know the ID (identity column). So, if the behavior was
changed between 2.6.5 and 2.6.2, then the AutoInc fields needs to
works too, no?

Now, how I can get the ID using AutoInc, please?

=== BEGIN CODE ===
procedure TghSQLdbQuery.ApplyRecUpdate(UpdateKind: TUpdateKind);
var
  I: Integer;
  LastId: NativeInt;
  Fld: TField;
begin
  inherited;

  if UpdateKind <> ukInsert then
    Exit;

  for I := 0 to Fields.Count -1 do
  begin
    Fld := Fields.Fields[I];
    if Fld.IsNull and
       ((Fld.DataType = ftAutoInc) or (LowerCase(Fld.FieldName) =
'id') and (Fld is TNumericField)) then
    begin
      LastId := FLib.GetLastAutoIncValue;
      if LastId <= 0 then
        Exit;

      Edit;
      Fields[I].SetData(@LastId);
      Post;
      Exit;
    end;
  end;
end;
=== END CODE ===

[1] https://github.com/mdbs99/Greyhound

Regards,
Marcos Douglas


More information about the fpc-pascal mailing list