2013-10-21 36 views
2

我正嘗試使用Advantage OLE DB提供程序連接我的數據庫(Advantage 7.1 Server)。到目前爲止好......它連接與下面的代碼沒有問題: -如何通過ADO連接時獲取AUTOINC值?

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時保持爲零(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; 
+1

我不熟悉的優勢和這個職位是比較舊:http://devzone.advantagedatabase.com/dz/Content.aspx?Key=17&RefNo=030606-1534 – bummi

回答

1

你應該考慮使用TADSConnectionTADSQuery等,你仍然可以從DevZone(http://devzone.advantagedatabase.com/dz/content.aspx?key=1)即使ADS 7.1下載組件。

如果您必須使用ADO,則可能需要使用其他方法。 (但請參閱bummi關於Delphi中可能的錯誤的評論)。

的一種方法是使用LASTAUTOINC標量函數:

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

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

在Delphi中ADO您可以在您的SQL查詢字符串傳遞超過1個語句 - 一般來說,這可能真正的ADO。

插入測試(文本)值('ddd');從測試選擇*其中AutoIncColumn = SCOPE_IDENTITY()

這將與自動遞增值返回插入的行

,或者如果你只需要在AUTOINC值

INSERT INTO測試(文本)值('ddd');選擇SCOPE_IDENTITY()AutoIncColumn