Bug fix (IBScript Delphi7)

เมื่อต้องเขียน 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 เสร็จ

Comments

  1. เมื่อต้อง install windows + install Delphi ใหม่ทั้งหมด
    ต้องทำการ install update IBx เหล่านี้ด้วยนะครับ
    -IBXDP707
    -IBXDP708
    -IBXDP711

    ReplyDelete
  2. ไม่คิดว่าต้องมาอ่าน Blog ตัวเองเพื่อแก้ปัญหาให้ตัวเองด้วยเลย

    ReplyDelete

Post a Comment