FireDACの秘密:最後に挿入された自動生成IDとEnterprise Connectors

Posted by on in Blogs

この記事は Eli M. による Secrets Of FireDac: Last Inserted Auto Generated Id And Enterprise Connectors の抄訳です。

 自動インクリメントフィールドがあるテーブルにデータを挿入するとき、一般的にはSQLクエリを使用して新しく作成されたレコードの最後に挿入されたIDを取得します。TFDQueryを使用してINSERTクエリを実行し、続いて、SELECTクエリを実行すれば、新しく挿入された自動インクリメントIDを取得できます。

異なるデータベースには、これを実現するために異なるSQLクエリがあります。 たとえば、MySQLには、LAST_INSERT_ID(例:SELECT LAST_INSERT_ID))という名前で実行できるSELECTクエリ関数があります。 このSELECT文を直接実行するか、FireDAC内蔵の機能を使用することができます。

FireDACには、GetLastAutoGenValueというTFDConnectionコンポーネントから呼び出すことのできる関数が用意されています。 Oracle、InterBase / Firebird、MySQL、MSSQLなどのデータベースをサポートし、最後に挿入されたIDを返します。 それは、最後に挿入されたIDを返すために、異なるデータベースごとに一意のSQLクエリを使用します。 以下はDocWikiのものです。

GetLastAutoGenValueメソッドは、最後に自動生成された値を返します。 意味と結果は、次の表に示すようにDBMSによって異なります。

DBMS

説明

Oracle

AName はシーケンスの名前です。セッションに存在する場合、CurrValue を返します。

InterBase/Firebird

AName はジェネレータの名前です。GEN_ID(0) を返します。

MS SQL Server、MySQL など

セッションで最後に自動生成された値です。

CData社によるEnterprise Connectorsは、実行中のバージョンでGetLastAutoGenValue関数をサポートしていないようですが、SCOPE_IDENTITY()と呼ばれる独自のSQLクエリを持っています。(例:SELECT SCOPE_IDENTITY())。 私はCData Salesforce Enterprise ConnectorでSCOPE_IDENTITY()関数を使用しました。 SCOPE_IDENTITY()は、FireDACのCDataヘルプファイルにはあまり記載されていませんが、ヘルプファイルのSELECT構文で表示されます。

 

//
SELECT {
  [ TOP  | DISTINCT ]
  {
    *
    | {
         [ [ AS ]  ]
        | {  |  } .*
      } [ , ... ]
  }
  [ INTO csv:// [ filename= ]  [ ;delimiter=tab ] ]
  {
    FROM  [ [ AS ]  ]
  } [ , ... ]
  [ [ 
      INNER | { { LEFT | RIGHT | FULL } [ OUTER ] }
    ] JOIN  [ ON  ] [ [ AS ]  ]
  ] [ ... ]
  [ WHERE  ]
  [ GROUP BY  [ , ... ]
  [ HAVING  ]
  [ UNION [ ALL ]  ]
  [
    ORDER BY
     [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ]
  ]
  [
    LIMIT 
    [
      { OFFSET | , }
      
    ]
  ]
} | SCOPE_IDENTITY()

 

 

 

 

 



About
Gold User, No rank,
Sales Consultant at Embarcadero Technologies.

Comments

Check out more tips and tricks in this development video: