Invalid BLOB handle in record buffer?? |
尚未結案
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
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 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
這是我在另一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 發送簡訊給我 |
你在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 發送簡訊給我 |
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 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |