2

Advantage OLE DB プロバイダーを使用してデータベース (Advantage 7.1 サーバー) に接続しようとしています。これまでのところとても良いです...以下のコードで問題なく接続します:-

const
  // the database we'll be connecting to 
  ConnectionString = 'Provider=Advantage OLE DB Provider;Data Source=C:\Data\'+
  'UsersData.add;ServerType=ADS_REMOTE_SERVER|ADS_LOCAL_SERVER;User ID=ISUsers;Password=aAoO31';

私の問題は、データベースに接続できても、データ型が AUTOINC のフィールドでは次の番号が生成されないことです。「ID」は、次の番号1、2、3に移動するのではなく、データを追加するたびにAUTOINCがゼロ(0)を返し続けるためです....しかし、MS ACCESSに切り替えると、同じコードで完全に機能します。私は何を間違っていますか?以下のコードを見つけてください。

    // Add template to database. Returns added template ID.
function TDBClass.addTemplate(template: TTemplate): Integer;
var
  rs: TADODataSet;
  tptStream: TMemoryStream;
  id: Integer;
  p: PChar;
begin
  // get DB data and append one row
  rs := TADODataSet.Create(nil);
  rs.Connection := connection;
  rs.CursorType := ctStatic;
  rs.LockType := ltOptimistic;
  rs.CommandText := 'SELECT * FROM enroll';
  rs.Open();
  rs.Append();
  tptStream := TMemoryStream.Create();
  // write template data to memory stream.
  SafeArrayAccessData(template.tpt, Pointer(p));
  tptStream.write(p^, template.size);
  SafeArrayUnaccessData(template.tpt);
  // save template data from memory stream to database.
  (rs.FieldByName('template') as  TBlobField).LoadFromStream(tptStream);
  // update the database with added template.
  rs.post();
  // get the ID of enrolled template.
  id := rs.FieldByName('ID').AsInteger;
  // close connection
  tptStream.Free();
  rs.Close();
  rs.Free();
  addTemplate := id;
end;
4

2 に答える 2

1

ADS 7.1 の場合でも、DevZone ( http://devzone.advantagedatabase.com/dz/content.aspx?key=1 )から引き続きダウンロードできる、、などのコンポーネントTADSConnectionの使用を検討する必要があります。TADSQuery

ADO を使用する必要がある場合は、おそらく別のアプローチを使用する必要があります。(ただし、Delphi のバグの可能性についての bummi のコメントも参照してください)。

1 つの方法は、LASTAUTOINCスカラー関数を使用することです。

INSERT INTO
  enroll
(
  template
)
VALUES
(
  :template
);

SELECT
  LASTAUTOINC(CONNECTION) AS "id"
FROM
  system.iota
于 2013-10-24T11:15:54.673 に答える