Beranda > Computer > AutoBind Query

AutoBind Query

Parameterized Query (Query berparameter) sebenarnya merupakan cara yang bisa dikatakan jauh lebih aman dalam pemrograman database, karena melalui parameter, Delphi akan mempassing parameter-parameter tersebut sesuai dengan tipe data masing-masing field secara benar. Hal ini selain meminimalisir kemungkinan kesalahan karena perbedaan format atas tipe data tertentu (umumnya tipe data DATE) antara sistem dengan yang dikenal oleh RDBMS, hal yang lebih penting justru meminimalisir kemungkinan query dimanfaatkan oleh user untuk melakukan manipulasi data secara tidak sah atau mungkin lebih dikenal sebagai SQL-Injection. Sayangnya penggunaan query berparameter ini bisa dibilang bertele-tele, sehingga sebagian programmer malas menggunakannya karena lebih panjang dibandingkan jika membypass-nya secara langsung.

Contoh berikut :

MyQuery.SQL.Text := 'SELECT * FROM EMPLOYEE WHERE EMPID = '+edEmpid.Text+
    ' AND DEPTID ='+ edDeptID.Text;
  MyQuery.Open;

Lebih pendek jika dibandingkan bila menggunakan parameterized query (yang sebenarnya justru lebih baik):

MyQuery.SQL.Text := 'SELECT * FROM EMPLOYEE WHERE EMPID = :empid '+
    'AND DEPTID = :deptid';
  if not MyQuery.Prepared then
    MyQuery.Prepare;
  MyQuery.Params.ParamByName('empid').Value := edEmpid.Text;
  MyQuery.Params.ParamByName('deptid').Value := edEmpid.Text;
  MyQuery.Open;

Sebenarnya ada trik yang bisa dilakukan untuk membuat parameter-parameter tersebut secara otomatis dibinding dengan masing-masing value-nya, dengan dengan memindahkan proses binding tersebut ke dalam sebuah fungsi kita bisa menggunakan parameterized query seperti halnya direct passing.

BindQuery(MyQuery, 'SELECT * FROM EMPLOYEE WHERE EMPID = :empid '+
    'AND DEPTID = :deptid', VarAsArray([edEmpid.Text, edEmpid.Text]));
  MyQuery.Open;

Hanya saja, kendalanya seringkali implementasi fungsi tersebut bersifat database dependent, lebih tepatnya tergantung dari komponen dataset apa yang digunakannya. Sebenarnya ada cara yang bisa dilakukan untuk mengatasi hal ini, yaitu dengan memanfaatkan RTTI. Berikut ini adalah source atas fungsi BindQuery yang bersifat generik dan bisa digunakan untuk berbagai macam data access component (MySQLDAC, IBO, IBX, BDE) dan lain-lain. Komponen yang tidak disupport sejauh ini adalah ADO Express (dbGo) yang disebabkan karena tipikal cara kerja/pemanggilan parameter ini sedikit berbeda dari tipikal operasi yang umum dikenal.

Procedure BindQuery(ADataset: TDataset; const AQuery: string;
  AValues: Variant);
var
  SQLPropInfo,
  ParamsPropInfo: PPropInfo;
  SQList: TStrings;
  Params:  TParams;
  i : integer;
begin
  ADataset.Active := False;
  Assert(ADataset <> nil,'Dataset-nya ngawur mas, gimana sih!!!');
  SQLPropInfo := GetPropInfo(ADataset, 'SQL',[tkClass]);
  ParamsPropInfo := GetPropInfo(ADataset, 'Params',[tkClass]);
  SQList := TStrings(GetOrdProp(ADataset, SQLPropInfo));
  Params := TParams(GetOrdProp(ADataset, ParamsPropInfo));
  Assert((SQList <> nil) and (Params <> nil),
    'Ada satu atau lebih property yang ndak valid');
  SQList.Text := AQuery;
  if VarIsArray(AValues) then
  begin
    for i := 0 to VarArrayHighBound(AValues, 1) do
    begin
      Params[i].Value := AValues[i];
    end;
  end else
    if AValues <> null then
      Params[0].Value := AValues;
end;
Iklan
Kategori:Computer
  1. Belum ada komentar.
  1. No trackbacks yet.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: