線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3839
推到 Plurk!
推到 Facebook!

Invalid BLOB handle in record buffer??

尚未結案
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-06 10:52:34 IP:61.59.xxx.xxx 未訂閱
請問一下這是什麼意思    在同樣的程式下,在不同的資料DBGrid都可顯示出資料, 但只要一按方向鍵,有的會有問題,有的不會
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-06 11:43:15 IP:218.163.xxx.xxx 未訂閱
BDE 參數 : BLOB SIZE=32(default) 把它放大到 1024 看看.
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-06 11:47:10 IP:202.39.xxx.xxx 未訂閱
http://community.borland.com/article/0,1410,15203,00.html 中的一段:    Q:   Why am I getting the error 'Invalid BLOB Handle in record      Buffer' when I attempt to modify a record containing a      BLOB? A:   This error can occur for two different reasons.      Case 1 - BDE API Application       This error is caused by not setting up the record      correctly. Make certain to call DbiInitRecord on the      record buffer before reading the record from the table.         CASE 2 - Any BDE Application      This error occurs when scrolling through more than 64      blobs in the results of a dead query. The solution is to      either make the results of the query a live result set,       or somehow limitscrolling blobs. (Such as having your       SELECT statement select fewer records.)      NOTE:A future release of the BDE is planned to be able to      be configured to get past the present hard coded limit.    --- 每個人都是一本書
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-06 12:44:18 IP:61.155.xxx.xxx 未訂閱
可能你要显示的字段包含BLOB、CLOB等类型的. 我想你的数据库可能是DB2吧! DBGRID不能显示这种类型的数据,如果BLOB是图象,请用DBIMAGE;如果不是 请用其它相关的DB控件显示。    供参考!    风花雪月 e梦情缘
------
风花雪月 e梦情缘
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-06 15:10:12 IP:61.59.xxx.xxx 未訂閱
對不起,我不了解何謂BLOB、CLOB 我想可能是資料來源格式之問題 因我的DBGrid是來自一Access MDB(1), 我將另一資料表(2)匯入到該DBGrid之來源資料表沒問題,但又將另依資料(2)同上述匯入後卻有問題,且資料(2)&(3)是完全同格式,只是輸入的資料不同而已 所以找不出方向,
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-06 15:43:23 IP:61.155.xxx.xxx 未訂閱
Paicaso 你好: 你可不可以将出错的源码帖出来,这样我们才可以帮你分析。光从出错提示上揣测是不行的。    风花雪月 e梦情缘
------
风花雪月 e梦情缘
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-06 16:32:21 IP:219.130.xxx.xxx 未訂閱
你沒問題的資料表應少於 64 筆 而有問題的應多於 64筆罷 ? 因為BDE 的Query 若不是 RequestLive 的話最多只能同時有 64個 BLOB 所以解決方法是 : 1. 設定 RequestLive 是 True   2. 每次選取少於 64 筆資料 (若1筆有兩個 BLOB 則 32筆,如些類推) 3. 主Query不選取 BLOB 欄位,若需要用到BLOB的資料,用另一個 Query 去選取該筆 BLOB 資料
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-07 02:43:46 IP:61.59.xxx.xxx 未訂閱
這是我在另一Form發現的問題 A-1(FoxPro)--匯入-->A-2(Access) B-1(FoxPro)--匯入-->B-2(Access) PS 分別使用Database & Query by ODBC 問題: 第一次執行無論在Insert or Update程序皆可,亦即無論目的端B-2(Access)是否有資料,但當執行過一次(不退出程式)再執行一次即會發生'Invalid BLOB handle in record buffer'之錯誤訊息,理應執行Update程序沒錯 相同的語法A-1(FoxPro)--匯入-->A-2(Access)沒也問題,只有在B-1(FoxPro)--匯入-->B-2(Access)會發生,(因程式碼機乎雷同,故便不Post) 我試過RequestLive = True 無效,且A-1(FoxPro)--匯入-->A-2(Access)也超過64筆沒也問題    以下是我的程式碼,請幫忙檢查與指正  Thanks    
procedure TFMTransPOS.FormCreate(Sender: TObject);
BEGIN
         TabSheet1.Show;
        //********資料A-1(FoxPro)********
        TransData.LYTsstockQUERY.SQL.Clear;
        TransData.LYTsstockQUERY.SQL.Add('Select * From sstock ');
        TransData.LYTsstockQUERY.SQL.Add('Order by sk_no');
        TransData.LYTsstockQUERY.CLOSE;
        TransData.LYTsstockQUERY.OPEN;            TransData.tcomQUERY.SQL.Clear;
        TransData.tcomQUERY.SQL.Add('SELECT Count(*) FROM sstock ');
        TransData.tcomQUERY.CLOSE;
        TransData.tcomQUERY.OPEN;
        Panel_P1.Caption := '資料筆數:共 ' IntToStr(TransData.tcomQuery.Fields[0].AsInteger) ' 筆';            //********資料A-2(Access)********
        DBGrid2.DataSource := TransData.BprdDataSource;                 TransData.BprdQUERY.SQL.Clear;
        TransData.BprdQUERY.SQL.Add('SELECT * FROM BPRD ');
        TransData.BprdQUERY.SQL.Add('Order by sk_no ');
        TransData.BprdQUERY.CLOSE;
        TransData.BprdQUERY.OPEN;            TransData.QUERYS.SQL.Clear;
        TransData.QUERYS.SQL.Add('SELECT Count(*) FROM Bprd ');
        TransData.QUERYS.CLOSE;
        TransData.QUERYS.OPEN;
        Panel_P2.Caption := '資料筆數:共 ' IntToStr(TransData.QueryS.Fields[0].AsInteger) ' 筆';            //********資料B-1(FoxPro)********
        DBGrid3.DataSource := TransData.LYTpcustDataSource;   //FoxPro            TransData.LYTpcustQUERY.SQL.Clear;
        TransData.LYTpcustQUERY.SQL.Add('Select * From pcust ');
        TransData.LYTpcustQUERY.SQL.Add('where ct_class=''1'' ');
        TransData.LYTpcustQUERY.SQL.Add('Order by ct_no');
        TransData.LYTpcustQUERY.CLOSE;
        TransData.LYTpcustQUERY.OPEN;            TransData.cenoQUERY.SQL.Clear;
        TransData.cenoQUERY.SQL.Add('SELECT Count(*) FROM pcust ');
        TransData.cenoQUERY.SQL.Add('where ct_class=''1'' ');
        TransData.cenoQUERY.CLOSE;
        TransData.cenoQUERY.OPEN;
        Panel_C1.Caption := '資料筆數:共 ' IntToStr(TransData.cenoQuery.Fields[0].AsInteger) ' 筆';            //********資料B-2(前台Access)********
        DBGrid4.DataSource := TransData.BcustDataSource;     //後台Access            TransData.BcustQUERY.SQL.Clear;
        TransData.BcustQUERY.SQL.Add('SELECT * FROM Bcust ');
        TransData.BcustQUERY.SQL.Add('Order by ct_no ');
        TransData.BcustQUERY.CLOSE;
        TransData.BcustQUERY.OPEN;            TransData.QUERYS.SQL.Clear;
        TransData.QUERYS.SQL.Add('SELECT Count(*) FROM Bcust ');
        TransData.QUERYS.CLOSE;
        TransData.QUERYS.OPEN;
        Panel_C2.Caption := '資料筆數:共 ' IntToStr(TransData.QueryS.Fields[0].AsInteger) ' 筆';
End;    //沒有問題
procedure TFMTransPOS.TransAllDATClick(Sender: TObject);
var
    L_SKENO,.........以下略過        i: Integer;
    GFORM : TFORM;      //(進度表)需在users有 FORMS, Gauges
    GGAUGE : TGAUGE;    //(進度表)需在users有 FORMS, Gauges
    GLabel : TLabel;
begin
         Try
         TransData.LYTsstockQuery.First;                     //FoxPro
         While not TransData.LYTsstockQuery.Eof do           //FoxPro
         Begin
         //======FoxPro======
         L_SKENO := Trim(TransData.LYTsstockQUERY.FieldByName('sk_no').AsString);      
         .....略.....             //開啟第二連結檔
         TransData.LYTsstkdtQUERY.SQL.Clear;
         TransData.LYTsstkdtQUERY.SQL.Add('SELECT * FROM SSTKDT ');
         TransData.LYTsstkdtQUERY.SQL.Add('WHERE sk_no = ''' L_SKENO ''' ');
         TransData.LYTsstkdtQUERY.SQL.Add('order by sk_no ');  
         TransData.LYTsstkdtQUERY.CLOSE;
         TransData.LYTsstkdtQUERY.OPEN;
         L_SKSUP := TransData.LYTsstkdtQUERY.FieldByName('s_supp').AsString; 
         .....略.....                    //開啟第三連結檔
         .....略.....                    //開啟資料庫(Access)
         TransData.BprdQUERY.SQL.Clear;
         TransData.BprdQUERY.SQL.Add('SELECT * FROM BPRD ');
         TransData.BprdQUERY.SQL.Add('WHERE sk_no = ''' L_SKENO ''' ');
         TransData.BprdQUERY.SQL.Add('Order by sk_no ');
         TransData.BprdQUERY.CLOSE;
         TransData.BprdQUERY.OPEN;             If TransData.BprdQuery.Eof = False then //----------------------------------------
         Begin
             Update_to_Bprd_ALL(L_SKENO,         .....略.....       );
         End Else Begin   //if BprdQuery.Eof
         Insert_to_Bprd(L_SKENO,         .....略.....       );
         END;  //else (BprdQuery.Eof)-------------------------------------------------------             TransData.LYTsstockQuery.Next;   //While not ** do    //FoxPro
         END;  //While
         
         TransData.BprdQUERY.SQL.Clear;
         TransData.BprdQUERY.SQL.Add('SELECT * FROM BPRD ');
         TransData.BprdQUERY.SQL.Add('Order by sk_no ');
         TransData.BprdQuery.Close;
         TransData.BprdQuery.Open;             Finally
         TransData.QUERYS.SQL.Clear;
         TransData.QUERYS.SQL.Add('SELECT Count(*) FROM Bprd ');
         TransData.QUERYS.CLOSE;
         TransData.QUERYS.OPEN;             end; //end try
end;    //--------------------------------------------------------------------------
procedure TFMTransPOS.TransAllCustClick(Sender: TObject);
var
    L_ctno,L_ctname,         .....略.....
Begin
         Try
         TransData.LYTpcustQuery.First;                     //FoxPro
         While not TransData.LYTpcustQuery.Eof do           //FoxPro
         Begin
         //======FoxPro======
         L_ctno := Trim(TransData.LYTpcustQUERY.FieldByName('ct_no').AsString);              
         .....略.....             //開啟第二連結檔
         .....略.....             //開啟資料庫(Access)
         TransData.BcustQUERY.SQL.Clear;
         TransData.BcustQUERY.SQL.Add('SELECT * FROM Bcust ');
         TransData.BcustQUERY.SQL.Add('WHERE ct_no = ''' L_ctno ''' ');
         TransData.BcustQUERY.SQL.Add('Order by ct_no ');
         TransData.BcustQUERY.CLOSE;
         TransData.BcustQUERY.OPEN;             If TransData.BcustQuery.Eof = False then
         Begin
            Update_to_BMEM(L_ctno,         .....略.....);
         End else begin   //If
            Insert_to_BMEM(L_ctno,         .....略.....);
         END;  //else             TransData.LYTpcustQuery.Next;   //While not ** do    //FoxPro
         END;  //While             TransData.BcustQUERY.SQL.Clear;
         TransData.BcustQUERY.SQL.Add('SELECT * FROM Bcust ');
         TransData.BcustQUERY.SQL.Add('Order by ct_no ');
         TransData.BcustQuery.Close;
         TransData.BcustQuery.Open;             Finally
         TransData.QUERYS.SQL.Clear;
         TransData.QUERYS.SQL.Add('SELECT Count(*) FROM Bcust ');
         TransData.QUERYS.CLOSE;
         TransData.QUERYS.OPEN;
         end; //end try
end;    //-----------------------------------------------------------------------------------
/Inset 新增資料之副程式
Procedure TFMTransPOS.Insert_to_BMEM(L_ctno,         .....略.....);
var SQL : String;
Begin
         TransData.QueryP.SQL.Clear;
         SQL := 'INSERT INTO BCUST ';
         SQL := SQL   '( ct_no ,         .....略..... )';
         SQL := SQL   ' Values ';
         SQL := SQL   '( :ct_no ,:ct_name ,         .....略..... )';
         TransData.QueryP.SQL.Text := SQL;             TransData.QueryP.ParamByName('ct_no').AsString        := L_ctno;
                  .....略.....             try TransData.QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end;    END;    //Update 更新資料之副程式
Procedure TFMTransPOS.Update_to_BMEM(L_ctno,         .....略.....);
var SQL : String;
Begin
         TransData.QueryP.SQL.Clear;
         SQL := 'Update BCUST SET ';
         SQL := SQL   ' ct_name    =:ct_name    ,         .....略.....  ';
         SQL := SQL   'Where ct_no = ''' L_ctno ''' ';
         TransData.QueryP.SQL.Text := SQL;             TransData.QueryP.ParamByName('ct_name').AsString      := L_ctname;
         .....略.....             try TransData.QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end;
END;
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-07 07:54:53 IP:218.163.xxx.xxx 未訂閱
你在SQL Explorer中設定Alias時可以看到一欄"BLOBS TO CACHE", 預設值為64,代表最多可有64個BLOB. 因此當你OPEN一個含BLOB欄位之DataSet時, 若超過64筆資料, open時無問題,只要指標移動一超過第64筆, 問題就出來了 解決方法: 1: 改BLOBS to CHCHE加大到滿足需求(最好不要如此) 2: open DataSet時不要含入BLOB field, 提供Button在click時才讀取 3: 用calculate field, 在onCalculate時讀取
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-07 10:08:30 IP:61.59.xxx.xxx 未訂閱
Thanks for everybody.. 1: 改BLOBS to CHCHE加大到滿足需求(最好不要如此)    -->32是預設值,因其他的資料不會有問題,所以可能不是此問題,又基於您的建義不要改此設定值 2: open DataSet時不要含入BLOB field, 提供Button在click時才讀取 可能是這些資料包含有BLOB field,但是..... 我不知BLOB是何義? Boolean? 3: 用calculate field, 在onCalculate時讀取 您的意思是指有計算值之欄位?
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-07 10:17:29 IP:61.155.xxx.xxx 未訂閱
Paicaso  你好:    你的问题可能出在程序中SELECT *的地方,请将*改成相关字段(最好不要包括BLOB、CLOB的类型)。 BLOB指二进制大数据类型(可存图形、影象、声音等类型) CLOB指大字节的数据,比如ACCESS的memo 风花雪月 e梦情缘
------
风花雪月 e梦情缘
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-07 10:30:56 IP:218.16.xxx.xxx 未訂閱
BLOB = Binary Large OBject CLOB = Charater Large OBject 均是一些較大的不定長度欄位。 處理這類欄位,一向最好的都是我一開始說的第三種方法:平常不選它,用時才選該一筆資料。即使沒這個 error, 亦可增加數據處理的效率,在多層架構更是如此。
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-05-08 13:44:39 IP:61.59.xxx.xxx 未訂閱
我的資料欄都沒有含有大長度之欄位. 比較奇怪的是我的另依表單與該有問題之表單幾乎完全相同 卻沒有問題,是不是BDE之關係,我的Database是ODBC 我將資料欄位刪除到僅剩下一欄,也還會 改BLOBS to CHCHE加大到64..1024也還是一樣
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-05-08 14:36:59 IP:61.155.xxx.xxx 未訂閱
请将您操作的表结构及相关字段类型POST上来,我们大家帮您看看!!!    风花雪月 e梦情缘
------
风花雪月 e梦情缘
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-05-09 00:29:49 IP:61.59.xxx.xxx 未訂閱
原本我是用BDE的Query,後來改成ADOQuery便OK ???
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-05-09 08:40:04 IP:218.16.xxx.xxx 未訂閱
我們也一直在說這是 bde 的限制哩 不用bde自然沒bde的限制了
系統時間:2024-07-02 14:40:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!