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 作为数据类型的字段都不会生成下一个数字。每当我附加数据而不是移动到下一个数字 1、2、3 时,AUTOINC 的“ID”都会不断给我零 (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

您应该考虑使用仍然可以从 DevZone ( http://devzone.advantagedatabase.com/dz/content.aspx?key=1TADSConnection ) 下载的、TADSQuery等组件,即使对于 ADS 7.1 也是如此。

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

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

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

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

在 Delphi ADO 中,您可以在 SQL 查询字符串中传递多于 1 条语句——这通常适用于 ADO。

插入测试(文本)值('ddd');Select * from test where AutoIncColumn = Scope_identity()

这将返回具有 Autoinc 值的插入行

或者如果您只需要 autoinc 值

插入测试(文本)值('ddd');选择 Scope_identity() AutoIncColumn

于 2014-05-01T15:28:19.683 回答