はじめに |
Takeは、昔Delphiを教えてもらった人に「データソースは使うな」と教えられました。
参考書を買っても大体データソースをプロパティでつなぐだけの説明で初心者にはそっちの方が簡単に見えたんだけど、実際細かいことをやっていくには、直接Queryでデータを引っ張り出してやるのが一番だとわかりました。
今は教えてくれた先輩や会社とは関わりがありませんが、あのときの指導が今、自分にDelphiを楽しませてくれていると思っています。
ただ、本当にこの類の資料がなくて苦労したので、自分なりのデータベースの使い方を説明します。
サンプルソースは、重要な流れに注目してください。
多分、そのまま走らせてもエラーになるだけです。 |
コンポーネントの関係(InterBase&FireBird編) |
![](img/Delphi_Query1.png) |
一番オーソドックスな関係で説明します。
IBDatabaseコンポーネント:1個のデータベースファイル全体にアクセスします。
IBTransactionコンポーネント:トランザクション管理を行います。
IBQueryコンポーネント:SQL文の実行を行います。ただし、レコード参照に専念。
IBUpdateSQLコンポーネント:レコードの挿入 ・更新・削除を行います。
それぞれをオブジェクトインスペクタでプロパティを関連づけします。 |
IBDatabaseでよく使うメソッド |
|
IBDatabase.Connected := True;
IBDatabase.Connected := False; |
IBTransactionでよく使うメソッド |
|
IBTransaction.StartTransaction;
IBTransaction.InTransaction;
IBTransaction.Commit;
IBTransaction.Rollback; |
IBQueryでよく使うメソッド |
|
IBQuery.Open;
IBQuery.Close;
IBQuery.Locate(フィールド名,検索文字,[オプション]);
IBQuery.FieldByName(フィールド名).AsString;とか
|
IBUpDateSQLでよく使うメソッド |
|
IBUpdateSQL.Query[モード選択].ParamByName.AsString;
IBUpdateSQL.Query[モード選択].ParamByName.AsInteger;
IBUpdateSQL.Query[モード選択].ParamByName.AsFloat;
IBUpdateSQL.Query[モード選択].ParamByName.AsDateTime;
IBUpdateSQL.ExecSQL(モード選択) ;
ukModify
ukInsert
ukDelete
|
※上記4項目を覚えてれば大体レコードがいじれます。 |
データベースの設定 |
![](img/tip_database1.gif) |
IBDatabase.DatabaseName := 'c:\TestSystem\Test.gdb';
IBDatabase.Params.Clear;
IBDatabase.Params.Add('user_name = SYSDBA');
IBDatabase.Params.Add('password = masterkey');
IBDatabase.Params.Add('sql_role_name = 3');
IBDatabase.Params.Add('lc_ctype= sjis_0208');
IBDatabase.Connected := True;
※ちなみに ユーザー名「SYSDBA」とパスワード「masterkey」はデフォルト値なので必ず変更しておくこと。 |
Queryを使ったレコードの読み出し |
|
IBQuery.Close;
IBQuery.SQL.Clear;
IBQuery.SQL.Add('SELECT * FROM ADDRESS');
IBQuery.SQL.Add('ORDER BY CODE ASC');
IBQuery.SQL.Open;
if Locate('CODE',EditCode.Text,[]) = True then
begin
EditZip.Text := IBQuery.FieldByName('Zip').AsString;
EditAddress.Text := IBQuery.FieldByName('Address').AsString;
end; |
UpdateSQLを使った挿入と更新 |
|
if IBQuery.Active = True then
begin
if not IBTransaction.InTransaction then
IBTransaction.StartTransaction;
if IBQuery.Locate('CODE',EditCode,[]) = True then
begin
try
IBUpdateSQL.Query[ukModify].ParamByName('Zip').AsString
:= EditZip.Text;
IBUpdateSQL.Query[ukModify].ParamByName('Address').AsString
:= EditAddress.Text;
IBUpdateSQL.ExecSQL('ukModify');
;IBTransaction.Commit;
except
raise;
IBTransaction.Rollback;
end;
end else begin
try
IBUpdateSQL.Query[ukInsert].ParamByName('Zip').AsString
:= EditZip.Text;
IBUpdateSQL.Query[ukInsert].ParamByName('Address').AsString
:= EditAddress.Text;
IBUpdateSQL.ExecSQL('ukInsert');
;IBTransaction.Commit;
except
IBTransaction.Rollback;
raise;
end;
end;
※SQL文設計通りのパラメータがそろってない場合は、ExecSQLのときにエラーになります。
|
UpdateSQLを使った削除 |
|
if IBQuery.Active = True then
begin
if not IBTransaction.InTransaction then
IBTransaction.StartTransaction;
try
IBUpdateSQL.Query[ukDelete].ParamByName(OLD_CODE).AsString
:= EditCode.Text;
IBUpdateSQL.ExecSQL(ukDelete);
;IBTransaction.Commit;
except
IBTransaction.Rollback;
raise;
end;
end; |
UpdateSQLを使った画像とかBlobの登録 |
|
uses Jpeg
var
MS:TMemoryStream;
begin
try
IBUpdateSQL.Query[ukModify].ParamByName('Zip').AsString := EditZip.Text;
IBUpdateSQL.Query[ukModify].ParamByName('Address').AsString
:= EditAddress.Text;
MS := TMemoryStream.Create;
if Image.Picture.Graphic <> Nil then
begin
JPEGImage.Picture.Graphic.SaveToStream(MS);
IBUpdateSQL.Query[ukModify].ParamByName('JPEGIMAGE').LoadFromStream(MS,ftBlob);
end
else
IBUpdateSQL.Query[ukModify].ParamByName('JPEGIMAGE').AsBlob
:= '';
IBUpdateSQL.ExecSQL('ukModify');
MS.Free;
;IBTransaction.Commit;
except
raise;
IBTransaction.Rollback;
end;
end;
|
Blobに保存した画像の読み出し |
|
var
ST:TStream;
JP:TJpegImage;
begin
EditZip.Text := IBQuery.FieldByName('Zip').AsString;
EditAddress.Text := IBQuery.FieldByName('Address').AsString;
JP := TJpegImage.Create;
ST := IBQuery.CreateBlobStream(dqryItem.FieldByName('JPEGIMAGE'),bmRead);
JP.LoadFromStream(ST);
if ST.Size > 0 then
Image.Picture.Graphic :=
JP;
ST.Free;
JP.Free;
end;
|