เมื่อต้องเขียน Update Table: บน database firebird
ซึ่งต้องมีลำดับการ update, insert, หรือ delete และต้อง ทำงานแบบ Batch SQL จะทำยังไงดีล่ะ
ด้วย Tools ที่เรามี Delphi 7 ก็พอเพียงแล้ว เพราะในตัว IDE มี component ที่ชื่อ IBCript component
มาดูหน้าตากันหน่อย
ก็ลองเขียนโปรแกรมและใช้งาน มันใช้งานได้ดีทีเดียวแต่คิดว่ามันต้องมีปัญหาแน่ ๆ คือหลังจากสั่ง IBScript1.ExecuteScript; และได้สั่ง Commit เพื่อทำการบันทึกลง DBMS. แล้ว ไปดูที่ DBMS. ไม่มีพบ Data รายการนั้น ๆ ที่ส่งมาเลย
แต่พอปิดโปรแกรม และกลับไปดูใน DBMS. กลับพบ ข้อมูลรายการดังกล่าว (มันเข้ามาแหละ) เอ๊ะ! ทำไมมันมาหลังจากปิดโปรแกรมมันต้องมีปัญหาด้าน Transaction แน่ ๆ
ลองผิดลองถูกไปเรื่อย มันไม่ใช่แล้ว
มันต้องมีปัญหาก็เลย ลองให้เพื่อนซึ่งใช้ Delphi Version ที่สูงกว่า ส่งไฟล์ IBScript.Pas มาให้ดูหน่อย ว่ามันต่างกันใน Procedure ที่เราสงสัยหรือไม่ว่ามันต้องมี Bug แน่ ๆ
และแล้วมันก็มีจริง ๆ ด้วย คือไฟล์ของ D7 ไม่เหมือนกับ ของเพื่อนที่ส่งมา
ก็แล้วจัดการแก้ไขและ Compile IBScript.pas เสียใหม่ด้วย (ตรงนี้ต้องทำนะครับ)
ส่วนตำแหน่งที่เพิ่ม code เข้าไปคือ procedure นี้
procedure TIBScript.ExecuteScript;
begin
FContinue := true;
FExecuting := true;
FCharSet := '';
InBatch := false;
if not Assigned(FDataset) then
//****************** Make defined IBTransaction default if it exists.
begin
FDMLQuery := TIBSQL.Create(FDatabase);
if Assigned(FTransaction) then
FDMLQuery.Transaction := FTransaction;
end;
//*** Changes END *****************
try
FStats.Clear;
if FStatsOn and Assigned(FDatabase) and FDatabase.Connected then
FStats.Start;
FSQLParser.Parse;
if FStatsOn then
FStats.Stop;
finally
FExecuting := false;
if Assigned(FDMLQuery) then
FreeAndNil(FDMLQuery);
end;
end;
เป็นอันจบกระบวนการครับ แก้ไขและ save และ compile เสร็จ
ซึ่งต้องมีลำดับการ update, insert, หรือ delete และต้อง ทำงานแบบ Batch SQL จะทำยังไงดีล่ะ
ด้วย Tools ที่เรามี Delphi 7 ก็พอเพียงแล้ว เพราะในตัว IDE มี component ที่ชื่อ IBCript component
มาดูหน้าตากันหน่อย
ก็ลองเขียนโปรแกรมและใช้งาน มันใช้งานได้ดีทีเดียวแต่คิดว่ามันต้องมีปัญหาแน่ ๆ คือหลังจากสั่ง IBScript1.ExecuteScript; และได้สั่ง Commit เพื่อทำการบันทึกลง DBMS. แล้ว ไปดูที่ DBMS. ไม่มีพบ Data รายการนั้น ๆ ที่ส่งมาเลย
แต่พอปิดโปรแกรม และกลับไปดูใน DBMS. กลับพบ ข้อมูลรายการดังกล่าว (มันเข้ามาแหละ) เอ๊ะ! ทำไมมันมาหลังจากปิดโปรแกรมมันต้องมีปัญหาด้าน Transaction แน่ ๆ
ลองผิดลองถูกไปเรื่อย มันไม่ใช่แล้ว
มันต้องมีปัญหาก็เลย ลองให้เพื่อนซึ่งใช้ Delphi Version ที่สูงกว่า ส่งไฟล์ IBScript.Pas มาให้ดูหน่อย ว่ามันต่างกันใน Procedure ที่เราสงสัยหรือไม่ว่ามันต้องมี Bug แน่ ๆ
และแล้วมันก็มีจริง ๆ ด้วย คือไฟล์ของ D7 ไม่เหมือนกับ ของเพื่อนที่ส่งมา
ก็แล้วจัดการแก้ไขและ Compile IBScript.pas เสียใหม่ด้วย (ตรงนี้ต้องทำนะครับ)
ส่วนตำแหน่งที่เพิ่ม code เข้าไปคือ procedure นี้
procedure TIBScript.ExecuteScript;
begin
FContinue := true;
FExecuting := true;
FCharSet := '';
InBatch := false;
if not Assigned(FDataset) then
//****************** Make defined IBTransaction default if it exists.
begin
FDMLQuery := TIBSQL.Create(FDatabase);
if Assigned(FTransaction) then
FDMLQuery.Transaction := FTransaction;
end;
//*** Changes END *****************
try
FStats.Clear;
if FStatsOn and Assigned(FDatabase) and FDatabase.Connected then
FStats.Start;
FSQLParser.Parse;
if FStatsOn then
FStats.Stop;
finally
FExecuting := false;
if Assigned(FDMLQuery) then
FreeAndNil(FDMLQuery);
end;
end;
เป็นอันจบกระบวนการครับ แก้ไขและ save และ compile เสร็จ
เมื่อต้อง install windows + install Delphi ใหม่ทั้งหมด
ReplyDeleteต้องทำการ install update IBx เหล่านี้ด้วยนะครับ
-IBXDP707
-IBXDP708
-IBXDP711
ไม่คิดว่าต้องมาอ่าน Blog ตัวเองเพื่อแก้ปัญหาให้ตัวเองด้วยเลย
ReplyDelete