2012-09-06 37 views
0

我有一個帶有LiveBindings的SQL Server的Delphi XE3 Firemonkey應用程序。我可以連接並查看網格上的所有數據。我有一個字段(「id」),它是SQL(通常稱爲AutoInc)上的「標識字段」。Delphi XE 3 LiveBindings AutoInc SQL服務器

當我嘗試添加一條記錄時,我得到「Field'id'必須有一個值。」

在過去,解決這個問題的辦法是關閉必需的字段布爾值。 (例如,使用DBISAM時,您不需要在數據庫中創建該字段,數據庫引擎在它到達時填充該字段,但不能創建MSSQL中不需要的標識字段。)

I'已經關閉了TField本身的要求,但是這沒有效果。

+1

您正在使用哪個數據集組件? –

+0

我正在使用DBX組件。 – blake

+0

嘿布雷克,你應該考慮[取消這個問題,如果你可以](http://stackoverflow.com/questions/13548037/javascript-return-exits-block-not-function)。我認爲這很有趣。 – jmort253

回答

2

我對我的應用程序有同樣的問題。解決這個問題有點棘手。首先,您必須將IDENTITY_INSERT設置爲ON。

procedure TdmUnit1.Identity(Table: string; OnOff: boolean); 
var s: string; 
begin 
    if OnOff = true then 
    s := 'ON' 
    else 
    s := 'OFF'; 
    s := 'SET IDENTITY_INSERT ' + '[dbo].[' + Table + '] ' + s; 
    SQLQuery1.SQL.Clear; 
    SQLQuery1.SQL.Add(s); 
    SQLQuery1.ExecSQL; 
end; 

然後你必須尋找你的表內最高的索引。那你可以用OnNewRecord-事件實現:

procedure TdmUnit1.ClientDataSet1NewRecord(DataSet: TDataSet); 
var 
    s: string; 
    i: integer; 
begin 
    s := 'SELECT IDENT_CURRENT(''AnyTable'')'; 
    SQLQuery1.SQL.Clear; 
    SQLQuery1.SQL.Add(s); 
    SQLQuery1.ExecSQL; 
    SQLQuery1.Active := true; 
    i := SQLQuery1.Fields[0].AsInteger; 
    ClientDataSet1.FieldByName('DB_IDX').AsInteger := i+1; 
    SQLQuery1.Active := false; 
end; 

後的ApplyUpdates(0),你必須關掉IDENTITY_INSERT。

+0

對不起,剛看到這個。我只是傳統的這個應用程序,但我會給這個嘗試下一個機會,我有。 – blake