我正在尝试使用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作为数据类型的字段都不会生成下一个数字。每当我追加数据而不是移至下一个数字1、2、3时,AUTOINC都会一直为我提供零(0)的“ ID”,但是对于相同的代码,如果我切换到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;
最佳答案
您应该考虑使用即使在ADS 7.1中仍可以从DevZone(http://devzone.advantagedatabase.com/dz/content.aspx?key=1)下载的TADSConnection
,TADSQuery
等组件。
如果必须使用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/