2012-09-06 5 views
0

SQL 서버에 LiveBindings가 포함 된 Delphi XE3 Firemonkey 앱이 있습니다. 그리드의 모든 데이터를 연결하고 볼 수 있습니다. 필드 ("id")는 SQL의 "ID 필드"(더 일반적으로 AutoInc라고 함)입니다.Delphi XE 3 LiveBindings AutoInc SQL Server

레코드를 추가하려고하면 "필드 'ID'에 값이 있어야합니다."

과거에는 필수 입력란 부울을 해제했습니다. 예를 들어, DBISAM을 사용하면 데이터베이스 자체의 필드를 필요 없게 만들고 DB 엔진이 해당 필드를 채우지 만 MSSQL에서는 ID 필드가 필요하지 않게 만들 수 있습니다.

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가 OFF 전환해야 후.

+0

죄송합니다, 이것을 보았습니다. 나는이 응용 프로그램을 위해 전통적으로 갔다. 그러나 나는 이것을 다음 번 기회로 시도 할 것이다. – blake