サーバーにコマンドを送信する
データベースへの接続:インデックス への移動
TIBDatabase 以外のデータベース接続コンポーネントでは,Execute メソッドを呼び出すことにより,関連するサーバー上で SQL 文を実行できます。文が SELECT 文の場合,Execute はカーソルを返すことができますが,この使用方法はお勧めしません。データを返す文を実行するうえでの望ましい方法は,データセットを使用することです。
Execute メソッドは,どのようなレコードも返さない単純な SQL 文を実行するのに非常に便利です。そのような文には,DDL(データ定義言語)文が含まれます。これは,CREATE INDEX,ALTER TABLE,DROP DOMAIN のような,データベースのメタデータの操作と作成を行います。データ操作言語(DML)SQL 文の中にも,結果セットを返さないものがあります。データに対してアクションを実行するが,結果セットを返さない DML 文は,INSERT,DELETE,および UPDATE です。
Execute メソッドの構文は,以下のように,接続の種類ごとに異なります。
- TDatabase:Execute は 4 つのパラメータをとります。実行する単一の SQL 文を指定する文字列,その文のパラメータ値を指定する Data.DB.TParams オブジェクト,次回の呼び出しのために文をキャッシュするかどうかを指定する論理値,返される BDE カーソルへのポインタです(これには nil を渡すことが推奨されます)。
- TADOConnection:Execute には 2 つのバージョンがあります。第 1 の構文はパラメータを 2 つとります。1 つは SQL 文を指定する WideString,もう 1 つは文を非同期に実行するか,およびレコードを返すかどうかを制御するオプションのセットを指定します。この第 1 の構文は,返されるレコードのためのインターフェースを返します。第 2 の構文は,SQL 文を指定する WideString,文の実行時に影響を受けるレコードの数を返す 2 番めのパラメータ,文が非同期に実行されるかどうかといったオプションを指定する 3 番めのパラメータをとります。どちらの構文も,SQL 文のパラメータ渡しについては想定していないことに注意してください。
- TSQLConnection:Execute が取るパラメータは 3 つあります。実行する SQL 文を 1 つだけ指定する文字列,SQL 文のパラメータ値を指定する Data.DB.TParams オブジェクト,そしてレコードを返すために作成される TCustomSQLDataSet を受け取るポインタです。
メモ: Execute を使って実行できる SQL 文は,一度に 1 つだけです。SQL スクリプトユーティリティのように複数の SQL 文を 1 回の Execute 呼び出しで実行することはできません。複数の文を実行するには,Execute の呼び出しを繰り返します。
パラメータのない文を実行するのは比較的簡単です。たとえば次のコードは,TSQLConnection コンポーネント上で,パラメータなしで CREATE TABLE 文(DDL)を実行します。
procedure TForm1.CreateTableButtonClick(Sender: TObject);
var
SQLstmt: String;
begin
SQLConnection1.Connected := True;
SQLstmt := 'CREATE TABLE NewCusts ' +
'( " +
' CustNo INTEGER, ' +
' Company CHAR(40), ' +
' State CHAR(2), ' +
' PRIMARY KEY (CustNo) ' +
')';
SQLConnection1.Execute(SQLstmt, nil, nil);
end;
void __fastcall TDataForm::CreateTableButtonClick(TObject *Sender)
{
SQLConnection1->Connected = true;
AnsiString SQLstmt = "CREATE TABLE NewCusts " +
"( " +
" CustNo INTEGER, " +
" Company CHAR(40), " +
" State CHAR(2), " +
" PRIMARY KEY (CustNo) " +
")";
SQLConnection1->Execute(SQLstmt, NULL, NULL);
}
パラメータを使用するには,Data.DB.TParams オブジェクトを作成しなければなりません。それぞれのパラメータ値に対して TParams.CreateParam.CreateParam メソッドを使って TParam オブジェクトを追加します。次に,TParam のプロパティを使ってパラメータを記述し,その値を設定します。
以上の処理を,TDatabase を使って INSERT 文を実行する次の例で説明します。この INSERT 文には,StateParam という名前の 1 つのパラメータがあります。そのパラメータに「CA」という値を設定するために,TParams オブジェクト(stmtParams という名前)が作成されます。
procedure TForm1.INSERT_WithParamsButtonClick(Sender: TObject);
var
SQLstmt: String;
stmtParams: TParams;
begin
stmtParams := TParams.Create;
try
Database1.Connected := True;
stmtParams.CreateParam(ftString, 'StateParam', ptInput);
stmtParams.ParamByName('StateParam').AsString := 'CA';
SQLstmt := 'INSERT INTO "Custom.db" '+
'(CustNo, Company, State) ' +
'VALUES (7777, "Robin Dabank Consulting", :StateParam)';
Database1.Execute(SQLstmt, stmtParams, False, nil);
finally
stmtParams.Free;
end;
end;
void __fastcall TForm1::INSERT_WithParamsButtonClick(TObject *Sender)
{
AnsiString SQLstmt;
TParams *stmtParams = new TParams;
try
{
Database1->Connected = true;
stmtParams->CreateParam(ftString, "StateParam", ptInput);
stmtParams->ParamByName("StateParam")->AsString = "CA";
SQLstmt = "INSERT INTO "Custom.db" ";
SQLstmt += "(CustNo, Company, State) ";
SQLstmt += "VALUES (7777, "Robin Dabank Consulting", :StateParam)";
Database1->Execute(SQLstmt, stmtParams, false, NULL);
}
__finally
{
delete stmtParams;
}
}
パラメータ付き SQL 文に対して,TParam オブジェクトを作成せずパラメータの値を指定しなかった場合は,SQL 文の実行時にエラーが発生することがあります(エラーが発生するかどうかは,データベースのバックエンドに何を使用しているかによります)。TParam オブジェクトが作成されても,それに対応するパラメータが SQL 文内になければ,アプリケーションが TParam を使用しようとしたときに例外が発生します。