Delphi IBQuery/IBSQL: IBSQL
IBSQL aslında kullanımı bayağı kolay. Fakat bu component’ın request live gibi bir seçeneği yok. Ayrıca update de edilemediği için DataSource.DataSet property’sine atanamıyor. Seçenek bile çıkmıyor o kadar, diyeyim. Bu sefer daha bütün bir kod yazdım.
Senaryo: 1 DB, 2 table, 1 IBTransaction, 5 EditBox, 1 Button, 1 IBSQL
Table1: NAMESS: ID (Int, PK), NAME (VarChar), LNAME (VarChar), AGE (Int)
Table2: INFO: ID (Int, PK), ADRESS (VarChar), GENDER (Char), AGE (Int), NAMESS_ID (Int, FK)
procedure TForm1.Button1Click(Sender: TObject);
var id: Integer;
cnt: Integer;
begin
if not IBTransaction1.InTransaction then
IBTransaction1.StartTransaction;
try
IBSQL1.SQL.Text:=’INSERT INTO NAMESS (NAME, LNAME) VALUES (:N, :LN)’;
IBSQL1.Params.ByName(‘N’).AsString:=Edit1.Text;
IBSQL1.Params.ByName(‘LN’).AsString:=Edit2.Text;
IBSQL1.ExecQuery;
//NAMESS’in son kaydedilen ID’sini al ve bunu INFO’ya yazdırmak için
//”id” diye belirlenen variable’da tut.
IBSQL1.SQL.Text:=’SELECT MAX(ID) FROM NAMESS’;
IBSQL1.ExecQuery;
id:=IBSQL1.Fields[0].AsInteger;
IBSQL1.Close;
IBSQL1.SQL.Text:=’INSERT INTO INFO (ADDRESS, GENDER, AGE, NAMESS_ID) VALUES (:ADD, :G, :A, :NID)’;
//Teker teker EditBox’ların adını yazacağımıza program bulsun
//veriyi kendi alsın yazsın kodu
for cnt:=3 to 5 do
begin
IBSQL1.Params.Vars[cnt-3].AsString :=
TEdit(FindComponent(‘Edit’+IntToStr(cnt))).Text;
end;
IBSQL1.Params.Vars[3].AsInteger:=id;
IBSQL1.ExecQuery;
IBTransaction1.Commit;
except
IBTransaction1.Rollback;
end;
end;
[EDIT:] IBDataset ile ilgili bir kod örneği koymaktan vazgeçtim. Kullanmadım bu component’ı çünkü. Daha çok işlem gerektirdiği halde, yersizce ve inatla, IBQuery kullanmaya devam ediyorum. Alıştım zira. Fakat IBDataset arama yaptığınızda karşınıza bir çok örnek çıkacaktır. Kullanımı rahat olmasından ve update edilebilmesinden ötürü bu component tercih ediliyor. O yüzden bu noktada bayrağı Google’a teslim ediyorum.
