0

SQL Server への LiveBinding を備えた Delphi XE3 Firemonkey アプリがあります。グリッド上のすべてのデータを接続して表示できます。SQL の「ID フィールド」(より一般的には AutoInc として知られている) であるフィールド (「id」) があります。

レコードを追加しようとすると、「フィールド 'id' には値が必要です」というメッセージが表示されます。

これまでは、必須フィールドのブール値をオフにすることでこれを修正していました。(たとえば、DBISAM では、データベース自体のフィールドを不要にし、そこに到達すると DB エンジンが入力しますが、MSSQL で ID フィールドを不要にすることはできません。)

TField 自体の要件をオフにしましたが、効果はありません。

4

1 に答える 1

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-Event で実現できること:

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 にする必要があります。

于 2012-11-06T11:32:04.923 に答える