delphi - 通过ADO连接时如何获取AUTOINC值?

标签 delphi ado auto-increment advantage-database-server

我正在尝试使用 Advantage OLE DB 提供程序连接我的数据库 (Advantage 7.1 Server)。到目前为止一切顺利...它与下面的代码连接没有问题:-

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 作为数据类型的字段都不会生成下一个数字。每当我附加数据时,AUTOINC 都会不断地给我“ID”,而不是移动到下一个数字 1、2、3...。但是对于相同的代码,如果我切换到 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;

最佳答案

您应该考虑使用 TADSConnectionTADSQuery 等组件,即使对于 ADS 7.1,您仍然可以从 DevZone ( http://devzone.advantagedatabase.com/dz/content.aspx?key=1 ) 下载这些组件。

如果您必须使用 ADO,您可能必须使用不同的方法。 (但另请参阅 bummi 关于 Delphi 中可能存在的错误的评论)。

一种方法是使用 LASTAUTOINC 标量函数:

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

SELECT
  LASTAUTOINC(CONNECTION) AS "id"
FROM
  system.iota

关于delphi - 通过ADO连接时如何获取AUTOINC值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19500133/

相关文章:

c# - 如何在 Delphi 和 C# 中格式化复合语句?

sql - VB6将文件路径插入SQL FROM子句

mysql - 更新 mySQL 时出现 ASP 错误 "Key column information is insufficient or incorrect."

sql-server-2008-r2 - 重置Microsoft SQL Server 2008 R2中的自动增量

delphi - Lazarus TStringGrid - 为单元格着色

http - Delphi 突触 TTCPBlockSocket

java - 当指定为 1 时,Derby 自动递增 100

sqlite - Pylons、SQlite 和自动增量字段

delphi - "LongMonthNames"变量无法识别?

mysql - ADODB 命令使用参数化 SQL 查询执行失败