Sign in Join
Wiki copytemporary

Working With TSQLQuery/ja: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1+---
2+[[Portal:Databases/ja|**データベースのポータル**]]
3+参照: · [[Databases/ja|Databases 概要]] · [[Database libraries/ja|ライブラリ]] · [[Database field type/ja|フィールドの型]] · [[Data Controls tab/ja|コントロール]] · [[Lazarus DB Faq/ja|FAQ]] · [[SqlDBHowto/ja]] · TSQLQuery の利用 · [[How to write in-memory database applications in Lazarus/FPC/ja|メモリ上で動作するデータベースの作り方]] · チュートリアル/練習となる記事: · [[Lazarus Database Overview/ja|概要]] · [[SQLdb Tutorial0/ja|0 - データベースのセットアップ]] · [[SQLdb Tutorial1/ja|1 - 開始]] · [[SQLdb Tutorial2/ja|2 - 編集]] · [[SQLdb Tutorial3/ja|3 - クエリ]] · [[SQLdb Tutorial4/ja|4 - データモジュール]] · [[SQLdb Programming Reference/ja]] · 各種データベース · [[Advantage Database Server/ja|Advantage]] \- [[MySQLDatabases/ja|MySQL]] \- [[mssqlconn/ja|MSSQL]] \- [[postgres/ja|Postgres]] \- [[Firebird/ja|Interbase]] \- [[Firebird/ja|Firebird]] \- [[Oracle/ja|Oracle]] \- [[ODBCConn/ja|ODBC]] \- [[TParadox/ja|Paradox]] \- [[SQLite/ja|SQLite]] \- [[Lazarus Tdbf Tutorial/ja|dBASE]] \- [[MS Access/ja|MS Access]] \- [[Zeos tutorial/ja|Zeos]]
4+**日本語版メニュー**
5+---
6+[[Main Page/ja|メインページ]] \- [[Lazarus Documentation/ja|Lazarus Documentation日本語版]] \- [[Japanese Localization Notes|翻訳ノート]] \- [[Bug Tracking/ja|日本語障害情報]]
7+
8+
9+
110## 概要
211
3-TSQLQuery は、データベース (Firebird、MS SQL Server、Oracle などの SQL を使用する RDBMS) からのデータセットを具体化できるオブジェクトである。 TSQLQuery の SQL プロパティで SELECT SQL ステートメントを使用すると、どのデータがデータベースからデータセットに取得されるかを決定できる。 プログラム (またはユーザー) によってデータセットが変更されると、その変更をデータベースに送信し返すことができる。
12+TSQLQuery は、データベース (Firebird、MS SQL Server、Oracle などの SQL を使用する RDBMS) からのデータセットを具体化できるオブジェクトである。 TSQLQuery の SQL プロパティで SELECT SQL ステートメントを使用すると、どのデータがデータベースからデータセットに取得されるかを決定できる。 プログラム (またはユーザー) によってデータセットが変更されると、その変更をデータベースに送信し返すことができる。
413
5-TSQLQuery は、データを直接変更するために使用することもできる。SQL プロパティで目的の INSERT、UPDATE、DELETE などの SQL ステートメントを指定し、TSQLQuery の ExecSQL メソッドを呼び出すと、クエリ オブジェクトは何の結果も取得せずに SQL をデータベースに送信する。。
14+TSQLQuery は、データを直接変更するために使用することもできる。SQL プロパティで目的の INSERT、UPDATE、DELETE などの SQL ステートメントを指定し、TSQLQuery の ExecSQL メソッドを呼び出すと、クエリ オブジェクトは何の結果も取得せずに SQL をデータベースに送信する。
615
7-FPC での使用とは別に、Lazarus は次のコンポーネントも提供する: [[TSQLQuery/ja]] ![](/wiki-images/b/bb/Tsqlquery.png)
16+FPC での使用とは別に、Lazarus は次のコンポーネントも提供する: [[TSQLQuery/ja]] [![tsqlquery.png](/wiki-images/b/be/tsqlquery.png)](</File:tsqlquery.png>)
817
918## 公式ドキュメント
1019
11-[TSQLQuery documentation](http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.html)を参照のこと。
12-
13-多くの状況感知型ドキュメントが Lazarus で利用できるようになった。 残念ながら、TSQLQuery は Lazarus 1.0 ヘルプの索引には表示されない。 TSQLQuery のメソッドとプロパティにカーソルを置いたら、F1 キーを押して、そのコードが文書化されているかどうかを確認されたい。 例えば これはうまくいく:
20+[TSQLQuery documentation](<http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.html>)を参照のこと。
1421
15-``` pascal
22+多くの状況感知型ドキュメントが Lazarus で利用できるようになった。 残念ながら、TSQLQuery は Lazarus 1.0 ヘルプの索引には表示されない。 TSQLQuery のメソッドとプロパティにカーソルを置いたら、F1 キーを押して、そのコードが文書化されているかどうかを確認されたい。 例えば これはうまくいく:
23+```
1624var
17-Q: TSQLQuery
18-...
19- Q.Open; //<--- カーソルを Openの上において F1を押す
25+ Q: TSQLQuery
26+ ...
27+ Q.Open; //<--- カーソルを Openの上において F1を押す
2028```
2129
2230## 一般的に用いられるコントロール
2331
24-TSQLQuery によって返されたデータセットは、[[TDBGrid/ja]] のインスタンスを使用して便利に*表示*できるが、個々のフィールドやセルのデータを*編集*するにはあまり適していない。または、この目的のために、[[TDBEdit/ja]] などのデータ対応、単一フィールド コントロールをフォームに配置し、その DataSource プロパティを使用されているデータ ソースに設定する必要がある。 DataField プロパティは、名前付きフィールド (「IDENTITY」など) または適切な文字列を返す式に設定する必要がある。
32+TSQLQuery によって返されたデータセットは、[[TDBGrid/ja]] のインスタンスを使用して便利に _表示_ できるが、個々のフィールドやセルのデータを _編集_ するにはあまり適していない。または、この目的のために、[[TDBEdit/ja]] などのデータ対応、単一フィールド コントロールをフォームに配置し、その DataSource プロパティを使用されているデータ ソースに設定する必要がある。 DataField プロパティは、名前付きフィールド (「IDENTITY」など) または適切な文字列を返す式に設定する必要がある。
2533
26-[[TDBNavigator/ja]] ツールバーの追加により、レコード間の移動や、編集するレコードの選択が非常に簡単になる。 ツールバーでレコードを選択するか、データ グリッド内でマウスを移動してレコードを選択すると、関連する行と列のデータが TDBEdit ボックスに表示され、「編集」ボタンをクリックすると、編集ボックスの内容を変更できる。「投稿」ボタンをクリックすると変更が確定し、「キャンセル」ボタンをクリックすると変更がキャンセルされる。
34+[[TDBNavigator/ja]] ツールバーの追加により、レコード間の移動や、編集するレコードの選択が非常に簡単になる。 ツールバーでレコードを選択するか、データ グリッド内でマウスを移動してレコードを選択すると、関連する行と列のデータが TDBEdit ボックスに表示され、「編集」ボタンをクリックすると、編集ボックスの内容を変更できる。「投稿」ボタンをクリックすると変更が確定し、「キャンセル」ボタンをクリックすると変更がキャンセルされる。
2735
28-一般に、プロセスは次のとおりである:
36+一般に、プロセスは次のとおりである:
2937
30-1. [[TSQLQuery/ja]] をフォーム/データモジュールに配置し、*Database*、*Transaction*、および *SQL* プロパティを設定する。
31-2. [[TDataSource/ja]] コンポーネントを配置し、その *DataSet* プロパティを TSQLQuery インスタンスに設定する。
32-3. [[TDBGrid/ja]] をフォームに配置し、その *DataSource* プロパティを TDataSource インスタンスに設定する。
33-4. 必要に応じて、TDBNavigator インスタンスをフォームに配置し、その *Datasource* プロパティを TDatasource インスタンスに設定する。この後、*Active*プロパティを*True*に設定すると、クエリによって取得されたデータを確認できるようはずである。
38+ 1. [[TSQLQuery/ja]] をフォーム/データモジュールに配置し、 _Database_ 、 _Transaction_ 、および _SQL_ プロパティを設定する。
39+ 2. [[TDataSource/ja]] コンポーネントを配置し、その _DataSet_ プロパティを TSQLQuery インスタンスに設定する。
40+ 3. [[TDBGrid/ja]] をフォームに配置し、その _DataSource_ プロパティを TDataSource インスタンスに設定する。
41+ 4. 必要に応じて、TDBNavigator インスタンスをフォームに配置し、その _Datasource_ プロパティを TDatasource インスタンスに設定する。この後、 _Active_ プロパティを _True_ に設定すると、クエリによって取得されたデータを確認できるようはずである。
3442
35-(*TSQLConnection*コンポーネントと*TSQLTransaction*コンポーネントの両方がアクティブである場合)
43+(_TSQLConnection_ コンポーネントと _TSQLTransaction_ コンポーネントの両方がアクティブである場合)
3644
3745## データを更新する
3846
39-レコードを DELETE または変更できるようにする必要がある場合、データベース テーブルは次のいずれかを行う必要がある
40-
41-1. PRIMARY KEY 列が 1 つ含まれている。
42-2. レコードを一意に決定する一連のフィールドがある。 通常、これらは一意のインデックスの一部である必要がある。これは必須ではないが、クエリが大幅に高速化される。
47+レコードを DELETE または変更できるようにする必要がある場合、データベース テーブルは次のいずれかを行う必要がある
4348
44-主フィールドがない場合、またはレコードを一意に決定するフィールドがない場合は、PRIMARY KEY フィールドを追加する必要がある。 これは、テーブル構造の設計時、作成時に行うことが望ましいが、後で追加することもできる。
49+ 1. PRIMARY KEY 列が 1 つ含まれている。
50+ 2. レコードを一意に決定する一連のフィールドがある。 通常、これらは一意のインデックスの一部である必要がある。これは必須ではないが、クエリが大幅に高速化される。
4551
46-たとえば、MySQL クライアントの次のコード例は、テーブルに一意のインデックスを追加する:
52+主フィールドがない場合、またはレコードを一意に決定するフィールドがない場合は、PRIMARY KEY フィールドを追加する必要がある。 これは、テーブル構造の設計時、作成時に行うことが望ましいが、後で追加することもできる。
4753
48-``` sql
54+たとえば、MySQL クライアントの次のコード例は、テーブルに一意のインデックスを追加する:
55+```
4956alter table testrig
50-add column autoid int
51-primary key auto_increment;
57+ add column autoid int
58+ primary key auto_increment;
5259```
5360
54-このフィールドを追加しても害はなく、アプリケーションでフィールドを更新できるようになる。
61+このフィールドを追加しても害はなく、アプリケーションでフィールドを更新できるようになる。
5562
5663## キャッシュされた更新
5764
58-*TSQLQuery*コンポーネントはすべての更新をキャッシュする。 つまり、更新はデータベースにすぐには送信されないが、*ApplyUpdates* メソッドが呼び出されるまでメモリ内に保持される。 その時点で、更新は SQL 更新ステートメントに変換され、データベースに適用される。 *ApplyUpdates* を呼び出さない場合、データベースはローカルの変更で更新されない。
65+_TSQLQuery_ コンポーネントはすべての更新をキャッシュする。 つまり、更新はデータベースにすぐには送信されないが、 _ApplyUpdates_ メソッドが呼び出されるまでメモリ内に保持される。 その時点で、更新は SQL 更新ステートメントに変換され、データベースに適用される。 _ApplyUpdates_ を呼び出さない場合、データベースはローカルの変更で更新されない。
5966
6067## プライマリキーフィールド
6168
62-レコードを更新するとき、*TSQLQuery* は、レコードの更新に使用できる主キーを構成するフィールドを知る必要がある。 どのフィールドを更新する必要があるか: その情報に基づいて、SQL の UPDATE、INSERT、または DELETE コマンドを構築する。
69+レコードを更新するとき、 _TSQLQuery_ は、レコードの更新に使用できる主キーを構成するフィールドを知る必要がある。 どのフィールドを更新する必要があるか: その情報に基づいて、SQL の UPDATE、INSERT、または DELETE コマンドを構築する。
6370
64-SQL ステートメントの構築は、*UsePrimaryKeyAsKey* プロパティと *ProviderFlags* プロパティによって制御されます。
71+SQL ステートメントの構築は、 _UsePrimaryKeyAsKey_ プロパティと _ProviderFlags_ プロパティによって制御されます。
6572
66-*Providerflags*プロパティは、次の 3 つのフラグのセットである:
73+_Providerflags_ プロパティは、次の 3 つのフラグのセットである:
6774
68-pfInkey
75+**pfInkey**
76+
6977フィールドはプライマリキーの一部である。
7078
71-pfInWhere
79+**pfInWhere**
80+
7281このフィールドは SQL ステートメントの WHERE 句で使用する必要がある。
7382
74-pfInUpdate
83+**pfInUpdate**
84+
7585更新または挿入には、このフィールドを含める必要がある。
7686
77-デフォルトでは、 *ProviderFlags*は *pfInUpdate* のみからなっている。
87+デフォルトでは、 _ProviderFlags_ は _pfInUpdate_ のみからなっている。
7888
79-テーブルに主キーがある場合 (上記のとおり)、*UsePrimaryKeyAsKey* プロパティを *True* に設定するだけですべてが行われます。これにより、主キー フィールドに *pfInKey* フラグが設定される。
89+テーブルに主キーがある場合 (上記のとおり)、 _UsePrimaryKeyAsKey_ プロパティを _True_ に設定するだけですべてが行われます。これにより、主キー フィールドに _pfInKey_ フラグが設定される。
8090
81-テーブルに主キー インデックスがないものの、レコードを一意に識別するために使用できるフィールドがいくつかある場合は、レコードを一意に決定するすべてのフィールドの *ProviderFlags* プロパティに *pfInKey* オプションを含めることができる。
91+テーブルに主キー インデックスがないものの、レコードを一意に識別するために使用できるフィールドがいくつかある場合は、レコードを一意に決定するすべてのフィールドの _ProviderFlags_ プロパティに _pfInKey_ オプションを含めることができる。
8292
83-*UpdateMode* プロパティは、どのフィールドが WHERE 句で正確に使用されるかを決定する:
93+_UpdateMode_ プロパティは、どのフィールドが WHERE 句で正確に使用されるかを決定する:
8494
85-upWhereKeyOnly
95+**upWhereKeyOnly**
96+
8697TSQLQueryが更新操作のためにWHERE句を構築する際に使用される。このオプションを指定すると、TSQLQueryは更新操作を行うための一意なレコードを特定するために、ProviderFlagsプロパティがpfInKeyフラグを持つすべてのフィールドの値を収集する。通常、これはUPDATEまたはDELETEステートメントでのみ必要である。
8798
88-upWhereChanged
99+**upWhereChanged**
100+
89101pfInKeyを持つフィールドだけでなく、ProviderFlagsプロパティにpfInWhereを持ち、かつ変更されたすべてのフィールドがWHERE句に含まれるようにする。
90102
91-upWhereAll
103+**upWhereAll**
104+
92105pfInKeyを持つフィールドに加えて、ProviderFlagsプロパティにpfInWhereを持つすべてのフィールドもWHERE句に含まれるようにする。
93106
94107## 更新をコントロールする
95108
96-特定のフィールドを更新するように指定することができる: 前述の通り、*ProviderOptions*プロパティに*pfInUpdate*を持つフィールドのみがSQL UPDATEまたはINSERTステートメントに含まれる。デフォルトでは、*pfInUpdate*は常に*ProviderOptions*プロパティに含まれる。
109+特定のフィールドを更新するように指定することができる: 前述の通り、 _ProviderOptions_ プロパティに _pfInUpdate_ を持つフィールドのみがSQL UPDATEまたはINSERTステートメントに含まれる。デフォルトでは、 _pfInUpdate_ は常に _ProviderOptions_ プロパティに含まれる。
97110
98111## SQLをTSQLQueryの中でカスタマイズする
99112
100-通常、TSQLQuery は、上で説明したプロパティに基づいて汎用 SQL ステートメントを使用する。 ただし、sqldb によって作成された汎用 SQL は、状況によっては正しくない可能性がある。 TSQLQuery を使用すると、データベースの状況に応じて最適に機能するように、さまざまなアクションに使用される SQL ステートメントをカスタマイズできる。 この目的のために、プロパティ *SQL*、*InsertSQL*、*UpdateSQL*、および *DeleteSQL* を使用する。
113+通常、TSQLQuery は、上で説明したプロパティに基づいて汎用 SQL ステートメントを使用する。 ただし、sqldb によって作成された汎用 SQL は、状況によっては正しくない可能性がある。 TSQLQuery を使用すると、データベースの状況に応じて最適に機能するように、さまざまなアクションに使用される SQL ステートメントをカスタマイズできる。 この目的のために、プロパティ _SQL_ 、 _InsertSQL_ 、 _UpdateSQL_ 、および _DeleteSQL_ を使用する。
101114
102115## SQLをTSQLQueryの中でカスタマイズする
103116
104-通常、TSQLQuery は、上で説明したプロパティに基づいて汎用 SQL ステートメントを使用する。 ただし、sqldb によって作成された汎用 SQL は、状況によっては正しくない可能性がある。 TSQLQuery を使用すると、データベースの状況に応じて最適に機能するように、さまざまなアクションに使用される SQL ステートメントをカスタマイズできる。 この目的のために、プロパティ *SQL*、*InsertSQL*、*UpdateSQL*、および *DeleteSQL* を使用する。
117+通常、TSQLQuery は、上で説明したプロパティに基づいて汎用 SQL ステートメントを使用する。 ただし、sqldb によって作成された汎用 SQL は、状況によっては正しくない可能性がある。 TSQLQuery を使用すると、データベースの状況に応じて最適に機能するように、さまざまなアクションに使用される SQL ステートメントをカスタマイズできる。 この目的のために、プロパティ _SQL_ 、 _InsertSQL_ 、 _UpdateSQL_ 、および _DeleteSQL_ を使用する。
105118
106-これらのすべてのプロパティは、複数行のSQLを受け入れるTStringList型のプロパティです。すべてのプロパティには、IDE内にプロパティエディタが付属してる。IDEでプロパティを選択し、省略ボタンをクリックしてエディタを開く。このエディタ([[Database metadata|TSQLQuery metadata tool]])では、テーブル情報などを参照することもできる。
119+これらのすべてのプロパティは、複数行のSQLを受け入れるTStringList型のプロパティです。すべてのプロパティには、IDE内にプロパティエディタが付属してる。IDEでプロパティを選択し、省略ボタンをクリックしてエディタを開く。このエディタ([[Database metadata|TSQLQuery metadata tool]])では、テーブル情報などを参照することもできる。
107120
108-コード内では、例えば`InsertSQL.Text`や`InsertSQL.Add()`を使用して、SQLステートメントの行を設定したり追加したりします。1つのステートメントは複数行にまたがる場合があり、セミコロンで終わる。
121+コード内では、例えば`InsertSQL.Text`や`InsertSQL.Add()`を使用して、SQLステートメントの行を設定したり追加したりします。1つのステートメントは複数行にまたがる場合があり、セミコロンで終わる。
109122
110-また、4 つのプロパティはすべて、以下で説明するパラメータを受け入れる。
123+また、4 つのプロパティはすべて、以下で説明するパラメータを受け入れる。
111124
112125### SQL - 基本的なSQLカスタマイゼーション
113126
114-SQL プロパティは通常、データベースからデータをフェッチするために使用される。 このプロパティの汎用 SQL は `SELECT * FROM fpdev` です。`fpdev` はデータベースに設定されているテーブルである。
115-
116-汎用 SQL ステートメントによって返されるデータセットは、かなり粗いものになる。 結果を TDBGrid で表示すると、レコードの順序がランダムに見えたり、列の順序が意図したものと異なったり、フィールド名は技術的には正しいものの、ユーザーフレンドリーではない可能性がある。 カスタマイズされた SQL を使用すると、これを改善できる。 id、UserName、InstEmail 列を持つ fpdev というテーブルの場合、次のようなことができる:
127+SQL プロパティは通常、データベースからデータをフェッチするために使用される。 このプロパティの汎用 SQL は `SELECT * FROM fpdev` です。`fpdev` はデータベースに設定されているテーブルである。
117128
118-``` sql
129+汎用 SQL ステートメントによって返されるデータセットは、かなり粗いものになる。 結果を TDBGrid で表示すると、レコードの順序がランダムに見えたり、列の順序が意図したものと異なったり、フィールド名は技術的には正しいものの、ユーザーフレンドリーではない可能性がある。 カスタマイズされた SQL を使用すると、これを改善できる。 id、UserName、InstEmail 列を持つ fpdev というテーブルの場合、次のようなことができる:
130+```
119131SELECT id AS 'ID', UserName AS 'User', InstEmail AS 'e-mail' FROM fpdev ORDER BY id;
120132```
121133
122-上記のクエリの結果として得られるデータセットは、クエリで指定されたフィールド名 (ID、ユーザー、および電子メール)、クエリで指定された列の順序を使用し、レコードは ID によって並べ替えられる。
134+上記のクエリの結果として得られるデータセットは、クエリで指定されたフィールド名 (ID、ユーザー、および電子メール)、クエリで指定された列の順序を使用し、レコードは ID によって並べ替えられる。
123135
124136### InsertSQL、UpdateSQL、DeleteSQL - パラメータの基本的な使用
125137
126-SQLQueryの**SQL**プロパティにSELECTクエリを割り当てると、SQLQueryはデータベースからデータを取得する方法を知っている。しかし、DBGridなどのデータバインドコントロールを使用する場合、SQLQueryはユーザーのアクションに基づいてデータベースから行を挿入、更新、削除する能力も必要となる。
127-
128-開発を加速するために、SQLQueryは必要なSQLステートメントを推測しようとすることができる。**SQL**プロパティが存在し、かつ**ParseSQL**プロパティがtrueである場合(デフォルトではtrueである)、SQLQueryは*SQL*プロパティを解析することでこれらのステートメントを生成しようとする。SQLDBはこれらのステートメントを**InsertSQL**、**UpdateSQL**、および**DeleteSQL**プロパティに格納する。
138+SQLQueryの**SQL** プロパティにSELECTクエリを割り当てると、SQLQueryはデータベースからデータを取得する方法を知っている。しかし、DBGridなどのデータバインドコントロールを使用する場合、SQLQueryはユーザーのアクションに基づいてデータベースから行を挿入、更新、削除する能力も必要となる。
129139
130-しかし、生成されたステートメントが機能しない場合(例えば、自動インクリメント/オートナンバープライマリキーを持つテーブルに挿入する場合)や、非常に遅い場合がある。必要に応じて、ステートメントを手動で割り当てることができる。
140+開発を加速するために、SQLQueryは必要なSQLステートメントを推測しようとすることができる。**SQL** プロパティが存在し、かつ**ParseSQL** プロパティがtrueである場合(デフォルトではtrueである)、SQLQueryは _SQL_ プロパティを解析することでこれらのステートメントを生成しようとする。SQLDBはこれらのステートメントを**InsertSQL** 、**UpdateSQL** 、および**DeleteSQL** プロパティに格納する。
131141
132-*InsertSQL*、*UpdateSQL*、*DeleteSQL*プロパティのステートメントは、データセット内のフィールドを表すパラメーターを受け入れる。 以下の規則が適用される:
142+しかし、生成されたステートメントが機能しない場合(例えば、自動インクリメント/オートナンバープライマリキーを持つテーブルに挿入する場合)や、非常に遅い場合がある。必要に応じて、ステートメントを手動で割り当てることができる。
133143
134-- パラメーター名は、データセットで使用されるフィールド名と完全に同じである必要がある。データセット内のフィールド名は、使用されるSELECTステートメントによってテーブル内の列名と異なる場合がある(上記を参照)。
135-- SQLDBの他のクエリのパラメータと同様に、パラメータ名はコロンを前置して記述する必要がある。
136-- 更新/削除ステートメントで使用する場合、データセットのフィールド名の前に**OLD_**(少なくともLazarus v. 1.0では**厳密に大文字**)を付けると、新しい値ではなく編集される前のレコードの値を取得できる。
144+_InsertSQL_ 、 _UpdateSQL_ 、 _DeleteSQL_ プロパティのステートメントは、データセット内のフィールドを表すパラメーターを受け入れる。 以下の規則が適用される:
137145
138-テーブルfpdev 、id、UserName、InstEmail というカラムがあり、データセットには ID、User、e-mail(select ステートメントの例を参照)というフィールドがリンクしている場合、このような **InsertSQL** クエリを書くことができる:
146+ * パラメーター名は、データセットで使用されるフィールド名と完全に同じである必要がある。データセット内のフィールド名は、使用されるSELECTステートメントによってテーブル内の列名と異なる場合がある(上記を参照)。
147+ * SQLDBの他のクエリのパラメータと同様に、パラメータ名はコロンを前置して記述する必要がある。
148+ * 更新/削除ステートメントで使用する場合、データセットのフィールド名の前に**OLD_**(少なくともLazarus v. 1.0では**厳密に大文字**)を付けると、新しい値ではなく編集される前のレコードの値を取得できる。
139149
140-``` sql
150+テーブルfpdev 、id、UserName、InstEmail というカラムがあり、データセットには ID、User、e-mail(select ステートメントの例を参照)というフィールドがリンクしている場合、このような **InsertSQL** クエリを書くことができる:
151+```
141152INSERT INTO fpdev(id, UserName, InstEmail) VALUES(:ID,:User,:e-mail);
142153```
143154
144-このステートメントは、データセットの現在のレコードから `ID`、`User`、`e-mail` の値を取得し、それぞれ `fpdev` テーブルの対応するフィールドに挿入しする。
145-
146-この例のステートメントは、実際には SQLDB 自体が自動生成するものとほぼ同じである。 与えられたステートメントは、`id` フィールドがユニークキー内の自動増分フィールドの場合、エラーが発生する可能性があります。さまざまなデータベースは、異なる方法でこの問題を解決している。例えば、次のような方法が MySQL で機能する。 異なるデータベースは、この問題を異なる方法で解決する。たとえば、次の方法は MySQL で機能する。
155+このステートメントは、データセットの現在のレコードから `ID`、`User`、`e-mail` の値を取得し、それぞれ `fpdev` テーブルの対応するフィールドに挿入しする。
147156
148-``` sql
157+この例のステートメントは、実際には SQLDB 自体が自動生成するものとほぼ同じである。 与えられたステートメントは、`id` フィールドがユニークキー内の自動増分フィールドの場合、エラーが発生する可能性があります。さまざまなデータベースは、異なる方法でこの問題を解決している。例えば、次のような方法が MySQL で機能する。 異なるデータベースは、この問題を異なる方法で解決する。たとえば、次の方法は MySQL で機能する。
158+```
149159INSERT INTO fpdev(id, UserName, InstEmail) VALUES(0,:User,:e-mail)
150- ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID();
160+ ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID();
151161```
152162
153-上記のステートメントは、新しいレコードを挿入しようとするが、`id`列には0(ゼロ)を使用する。 もしゼロが既にキーとして使用されている場合、重複が検出され、`id`は最後に挿入されたidを使用するように更新される。実際には、最後に使用されたidよりも1つ増えたidである。
154-
155-その文は、0を`id`列の値として新しいレコードを挿入しようとする。もし0がすでにキーとして使用されている場合、重複が検出され、`id`は最後に挿入されたidを使用するように更新される。実際には、最後に使用されたidよりも1つ大きいidが使用される。 Firebirdの場合、自動増分キーをエミュレートする場合[1](http://www.firebirdfaq.org/faq29/)、次のようなものが機能するはずである:
163+上記のステートメントは、新しいレコードを挿入しようとするが、`id`列には0(ゼロ)を使用する。 もしゼロが既にキーとして使用されている場合、重複が検出され、`id`は最後に挿入されたidを使用するように更新される。実際には、最後に使用されたidよりも1つ増えたidである。
156164
157-``` sql
165+
166+その文は、0を`id`列の値として新しいレコードを挿入しようとする。もし0がすでにキーとして使用されている場合、重複が検出され、`id`は最後に挿入されたidを使用するように更新される。実際には、最後に使用されたidよりも1つ大きいidが使用される。 Firebirdの場合、自動増分キーをエミュレートする場合[[1]](<http://www.firebirdfaq.org/faq29/>)、次のようなものが機能するはずである:
167+```
158168INSERT INTO fpdev(UserName, InstEmail) VALUES(:User,:e-mail);(
159169```
160170
161-このステートメントは、主キー以外のすべてを挿入し、Firebirdのbefore insertトリガーがジェネレータ/シーケンスを使用して`id`値を挿入する。 `INSERT`ステートメントでは、選択されたレコードの現在のフィールド値を使用したい場合がある。`UPDATE`ステートメントでは、編集前のフィールド値をWHERE句で使用する必要がある。前述のように、編集前のフィールド値は、フィールド名の前にOLD_が付いた形で書かれなければならない(Lazarus v. 1.0では、厳密に大文字である必要がある)。たとえば、次のクエリ:
162-
163-``` sql
171+このステートメントは、主キー以外のすべてを挿入し、Firebirdのbefore insertトリガーがジェネレータ/シーケンスを使用して`id`値を挿入する。 `INSERT`ステートメントでは、選択されたレコードの現在のフィールド値を使用したい場合がある。`UPDATE`ステートメントでは、編集前のフィールド値をWHERE句で使用する必要がある。前述のように、編集前のフィールド値は、フィールド名の前にOLD_が付いた形で書かれなければならない(Lazarus v. 1.0では、厳密に大文字である必要がある)。たとえば、次のクエリ:
172+```
164173UPDATE fpdev SET UserName=:User, InstEmail=:e-mail WHERE UserName=:OLD_User;
165174```
166175
167-上記のステートメントは、`User`が古い`User`値と等しいすべてのレコードの`UserName`および`InstEmail`列を更新する。
176+上記のステートメントは、`User`が古い`User`値と等しいすべてのレコードの`UserName`および`InstEmail`列を更新する。
168177
169-DELETEステートメントで現在のフィールド値と古いフィールド値を使用する方法は、読者に宿題として残しておく。
178+DELETEステートメントで現在のフィールド値と古いフィールド値を使用する方法は、読者に宿題として残しておく。
170179
171-以下の公式ドキュメントも参照のこと:
180+以下の公式ドキュメントも参照のこと:
172181
173-- [InsertSQL documentation](http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.insertsql.html)
174-- [UpdateSQL documentation](http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.updatesql.html)
175-- [DeleteSQL documentation](http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.deletesql.html)
182+ * [InsertSQL documentation](<http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.insertsql.html>)
183+ * [UpdateSQL documentation](<http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.updatesql.html>)
184+ * [DeleteSQL documentation](<http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.deletesql.html>)
176185
177186### TSQLQuery.SQLにおけるパラメータ
178187
179-ほとんどの状況では、TSQLQueryのSQLプロパティには、通常パラメータが必要ない select ステートメントが含まれる。ただし、それらを含めることもできる。これにより、レコードをフィルタリングする非常に簡単で強力な方法が提供される。
188+ほとんどの状況では、TSQLQueryのSQLプロパティには、通常パラメータが必要ない select ステートメントが含まれる。ただし、それらを含めることもできる。これにより、レコードをフィルタリングする非常に簡単で強力な方法が提供される。
180189
181-パラメータの利点は次のとおりである:
190+パラメータの利点は次のとおりである:
182191
183-- データをSQLテキスト、日付などの引数としてフォーマットする必要がないため、例えばMySQL用に日付をフォーマットする方法を覚える必要がない。これは、Firebirdの実装と異なる可能性がある。また、テキストデータをエスケープする必要もない。例えば、*O'Malley's "SQL Horror"*のようなテキストデータをエスケープする必要がない。
184-- パフォーマンスの向上の可能性
185-- SQLインジェクション攻撃からの保護
192+ * データをSQLテキスト、日付などの引数としてフォーマットする必要がないため、例えばMySQL用に日付をフォーマットする方法を覚える必要がない。これは、Firebirdの実装と異なる可能性がある。また、テキストデータをエスケープする必要もない。例えば、 _O'Malley's "SQL Horror"_ のようなテキストデータをエスケープする必要がない。
193+ * パフォーマンスの向上の可能性
194+ * SQLインジェクション攻撃からの保護
186195
187-パラメータの使用は、データベースのパフォーマンスを向上させることができる。ほとんどのデータベースはプリペアドステートメントをサポートしており、これはステートメントが準備され、データベースにキャッシュされることを意味する。プリペアドステートメントは複数回使用でき、使用するたびにステートメントの解析やクエリの計画が必要なく、パラメータのみが変更される。 同じステートメントが大量の回数使用される場合(パラメータの値のみが異なる場合)、プリペアドステートメントはパフォーマンスを大幅に向上させることができる。また、パラメータの使用により、SQLインジェクション攻撃を緩和することができる。
196+パラメータの使用は、データベースのパフォーマンスを向上させることができる。ほとんどのデータベースはプリペアドステートメントをサポートしており、これはステートメントが準備され、データベースにキャッシュされることを意味する。プリペアドステートメントは複数回使用でき、使用するたびにステートメントの解析やクエリの計画が必要なく、パラメータのみが変更される。 同じステートメントが大量の回数使用される場合(パラメータの値のみが異なる場合)、プリペアドステートメントはパフォーマンスを大幅に向上させることができる。また、パラメータの使用により、SQLインジェクション攻撃を緩和することができる。
188197
189-*InsertSQL*、*UpdateSQL*、および *DeleteSQL* プロパティには、現在のフィールド値と古いフィールド値のための事前定義されたパラメータがある。しかし、*SQL* プロパティにはありません。*Params* プロパティで独自のパラメータを作成できる。
198+_InsertSQL_ 、 _UpdateSQL_ 、および _DeleteSQL_ プロパティには、現在のフィールド値と古いフィールド値のための事前定義されたパラメータがある。しかし、 _SQL_ プロパティにはありません。 _Params_ プロパティで独自のパラメータを作成できる。
190199
191200#### Selectクエリの例
192201
193-この例は、パラメータを使用してデータを選択する方法を示している。また、SQL内でのエイリアス(... AS ...)の使用も示している。
194-
195-``` pascal
196- sql_temp.sql.text := 'SELECT id AS ''ID'', UserName AS ''User'', InstEmail AS ''e-mail'' FROM fpdev WHERE InstEmail=:emailsearch;'
197- ...
198- //これは、emailsearchというパラメータを生成する。
199-
200- // もし必要なら、パラメータがどのような種類のパラメータかを明示的に設定することもできる...
201- // これは、FPCが誤って推測した場合にのみ必要になるかもしれない:
202- // sql_temp.params.parambyname('emailsearch').datatype:=ftWideString
203-
204- //これでパラメータ値を入れることができる:
205- sql_temp.params.parambyname('emailsearch').asstring := 'mvancanneyt@freepascal.org';
206- ...
207- //そして、いつもの通りデータを引き出す
208- //場合によっては、パラメータ値を変え、再び実行する。
202+この例は、パラメータを使用してデータを選択する方法を示している。また、SQL内でのエイリアス(... AS ...)の使用も示している。
209203```
204+sql_temp.sql.text := 'SELECT id AS ''ID'', UserName AS ''User'', InstEmail AS ''e-mail'' FROM fpdev WHERE InstEmail=:emailsearch;'
205+ ...
206+ //これは、emailsearchというパラメータを生成する。
207+
208+ // もし必要なら、パラメータがどのような種類のパラメータかを明示的に設定することもできる...
209+ // これは、FPCが誤って推測した場合にのみ必要になるかもしれない:
210+ // sql_temp.params.parambyname('emailsearch').datatype:=ftWideString
211+
212+ //これでパラメータ値を入れることができる:
213+ sql_temp.params.parambyname('emailsearch').asstring := 'mvancanneyt@freepascal.org';
214+ ...
215+ //そして、いつもの通りデータを引き出す
216+ //場合によっては、パラメータ値を変え、再び実行する。
217+```
210218
211219#### Insertクエリの例
212220
213-この例は、パラメータを使用してテーブルに新しいレコードを挿入する方法を示している:
214-
215-``` pascal
216- sql_temp.sql.text := 'insert into PRODUCTS (ITEMNR,DESCRIPTION) values (:OURITEMNR,:OURDESCRIPTION)'
217- ...
218- sql_temp.Params.ParamByName('OURITEMNR').AsString := 'XXXX';
219- sql_temp.Params.ParamByName('OURDESCRIPTION').AsString := 'description';
220- sql_temp.ExecSQL;
221- SQLTransaction1.Commit; //もしくは、CommitRetainingアプリケーションの設定による
221+この例は、パラメータを使用してテーブルに新しいレコードを挿入する方法を示している:
222222```
223-
224-別の方法でこれをするには、以下のように:
223+sql_temp.sql.text := 'insert into PRODUCTS (ITEMNR,DESCRIPTION) values (:OURITEMNR,:OURDESCRIPTION)'
224+ ...
225+ sql_temp.Params.ParamByName('OURITEMNR').AsString := 'XXXX';
226+ sql_temp.Params.ParamByName('OURDESCRIPTION').AsString := 'description';
227+ sql_temp.ExecSQL;
228+ SQLTransaction1.Commit; //もしくは、CommitRetainingアプリケーションの設定による
229+```
225230
226-``` pascal
227- tsqlquery1.appendrecord(['XXXX', 'description'])
228- tsqltransaction1.commit; //もしくは CommitRetaining
231+別の方法でこれをするには、以下のように:
229232```
233+tsqlquery1.appendrecord(['XXXX', 'description'])
234+ tsqltransaction1.commit; //もしくは CommitRetaining
235+```
230236
231237### フォーマット関数を伴なうクエリ
232238
233-パラメータ化されたクエリの使用が好ましいアプローチだが、一部の状況では format 関数が代替手段となりうる(下記の警告を参照)。たとえば、接続の ExecuteDirect プロシージャでステートメントを実行する場合は、パラメータを使用することができない(*もちろん、問題のある SQL ステートメントを実行するためにクエリを使用することもできる*)。その場合、format 関数が役立つ:
234-
235-``` pascal
239+パラメータ化されたクエリの使用が好ましいアプローチだが、一部の状況では format 関数が代替手段となりうる(下記の警告を参照)。たとえば、接続の ExecuteDirect プロシージャでステートメントを実行する場合は、パラメータを使用することができない(_もちろん、問題のある SQL ステートメントを実行するためにクエリを使用することもできる_)。その場合、format 関数が役立つ:
240+```
236241procedure InsertRecord
237-var
238- aSQLText: string;
239- aSQLCommand: string;
240-begin
241- aSQLText:= 'INSERT INTO products(item_no, description) VALUES(%d, %s)';
242- aSQLCommand:= Format(aSQLText, [strtoint(Edit1.Text), Edit2.Text]);
243- aConnection.ExecuteDirect(aSQLCommand);
244- aTransaction.Commit;
245-end;
242+ var
243+ aSQLText: string;
244+ aSQLCommand: string;
245+ begin
246+ aSQLText:= 'INSERT INTO products(item_no, description) VALUES(%d, %s)';
247+ aSQLCommand:= Format(aSQLText, [strtoint(Edit1.Text), Edit2.Text]);
248+ aConnection.ExecuteDirect(aSQLCommand);
249+ aTransaction.Commit;
250+ end;
246251```
247252
248-変数の値が変更されると、クエリの値もそれに応じて変更される。これは、パラメータ化されたクエリと同様である。
253+変数の値が変更されると、クエリの値もそれに応じて変更される。これは、パラメータ化されたクエリと同様である。
249254
250-パラメータ%dは整数、%sは文字列などに使用される。詳細については、Format 関数のドキュメントを参照のこと。
255+パラメータ%dは整数、%sは文字列などに使用される。詳細については、Format 関数のドキュメントを参照のこと。
251256
252-> **Warning:** このテクニックでは、'を含むテキストや日付に関する問題に遭遇する可能性があることに注意すること!
257+[![Warning-icon.png](/wiki-images/b/b2/Warning-icon.png)](</File:Warning-icon.png>)
253258
254-## 独自のSQLを実行しメタデータを得る
259+**Warning:** このテクニックでは、'を含むテキストや日付に関する問題に遭遇する可能性があることに注意すること!
255260
256-一部の SQL ステートメントのチェック、トラブルシューティング、またはデータベースからのメタデータ (テーブルのリストなど) の取得だけを行いたい場合は、IDE 内から行うことができる。 プログラムでは、設計時に T*Connection、トランザクション、クエリ オブジェクトなどを設定し、クエリ オブジェクトの SQL プロパティに移動し、\[...\] ボタンをクリックする。
261+## 独自のSQLを実行しメタデータを得る
257262
258-SQL コードを含むウィンドウが表示され、次のようなステートメントを実行できる。
263+一部の SQL ステートメントのチェック、トラブルシューティング、またはデータベースからのメタデータ (テーブルのリストなど) の取得だけを行いたい場合は、IDE 内から行うことができる。 プログラムでは、設計時に T*Connection、トランザクション、クエリ オブジェクトなどを設定し、クエリ オブジェクトの SQL プロパティに移動し、[...] ボタンをクリックする。
259264
260-``` sql
265+SQL コードを含むウィンドウが表示され、次のようなステートメントを実行できる。
266+```
261267SELECT * FROM EMPLOYEE
262268```
263269
264-by pressing the play icon:
270+by pressing the play icon:
265271
266-![](/wiki-images/f/f2/Runsqlstatements.png)
272+[![runsqlstatements.png](/wiki-images/c/c5/runsqlstatements.png)](</File:runsqlstatements.png>)
267273
268-テーブル名、列名などのメタデータも取得できる (sqldb コネクタがそれをサポートしているが、最近ではほとんどのコネクタがサポートしている場合):
274+テーブル名、列名などのメタデータも取得できる (sqldb コネクタがそれをサポートしているが、最近ではほとんどのコネクタがサポートしている場合):
269275
270-![](/wiki-images/c/c9/Sqlquerymetadata.png)
276+[![sqlquerymetadata.png](/wiki-images/9/90/sqlquerymetadata.png)](</File:sqlquerymetadata.png>)
271277
272-([[Database metadata|Database metadata#Lazarus TSQLQuery metadata toolも]]参照のこと)
278+([[Database metadata|Database metadata#Lazarus TSQLQuery metadata tool]]も参照のこと)
273279
274280## 問題解決
275281
276282### ロギング
277283
278284詳細はここを参照のこと: [[SqlDBHowto/ja|SqlDBHowto/ja#問題解決法: TSQLConnection ログ]]
279285
280286### 芳しくない性能
281287
282-- データベースクエリを最適化し、適切なインデックスなどを使用する。クエリプランを提供するなど、データベースツールを使用すること。
283-- SQLQueryに進むときに、可能なパフォーマンス向上策については、以下の#エラー: メモリが足りない下を参照のこと。
288+ * データベースクエリを最適化し、適切なインデックスなどを使用する。クエリプランを提供するなど、データベースツールを使用すること。
289+ * SQLQueryに進むときに、可能なパフォーマンス向上策については、以下の#エラー: メモリが足りない下を参照のこと。
284290
285291### エラーメッセージ
286292
287293### エラー: メモリが足りない
288294
289-TSQLQuery は BufDataset の派生クラスであり、受信したデータをメモリにバッファリングするデータセットである。多くのレコードを取得する場合(例えば、エクスポート用にそれらをループで処理する場合)、ヒープメモリがいっぱいになり(すでに処理したレコードで)、メモリ不足のエラーが発生する可能性がある。
290-
291-この状況は FPC 開発版で改善されているが、回避策として、クエリを開く前に Unidirectional プロパティを true に設定して、既に読み取ったレコードを破棄するように bufdataset に指示することができる。
295+TSQLQuery は BufDataset の派生クラスであり、受信したデータをメモリにバッファリングするデータセットである。多くのレコードを取得する場合(例えば、エクスポート用にそれらをループで処理する場合)、ヒープメモリがいっぱいになり(すでに処理したレコードで)、メモリ不足のエラーが発生する可能性がある。
292296
293-``` pascal
297+この状況は FPC 開発版で改善されているが、回避策として、クエリを開く前に Unidirectional プロパティを true に設定して、既に読み取ったレコードを破棄するように bufdataset に指示することができる。
298+```
294299MySQLQuery.UniDirectional:=True;
295300```
296301
297-これでパフォーマンスも改善するかもしれない。
302+これでパフォーマンスも改善するかもしれない。
298303
299304### データセットは読み取り専用
300305
301-これは、FPCが更新可能であるとは認識していないが、実際には更新可能なクエリを指定した場合に発生する可能性がある。
302-
303-例:
306+これは、FPCが更新可能であるとは認識していないが、実際には更新可能なクエリを指定した場合に発生する可能性がある。
304307
305-``` sql
308+例:
309+```
306310select p.dob, p.surname, p.sex from people p;
307311```
308312
309313FPCのSQLパーサーはかなり単純であり、FROM句にコンマやスペースがあると、複数のテーブルが関与していると見なしてデータセットを読み取り専用に設定する。その弁護として、通常、1つのテーブルのみが関与している場合、テーブルにエイリアスを付けることは行われない 解決策:クエリを書き直すか、独自の`InsertSQL`、`UpdateSQL`、`DeleteSQL`を指定する。
310314
311315---
312-*From the Free Pascal wiki, page "Working With TSQLQuery/ja", as it stood on 2024-04-02 after a change by Ariben, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
316+*From the Free Pascal wiki, page "Working With TSQLQuery/ja", as the Internet Archive kept it on 2025-02-13, last changed on 2024-07-10. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history