各位高人,遇到一個困擾我多日的問題,就是在BCB中我用ADOquery往MySQL資料庫里的blob型別欄位里寫資料,用的方法是:
ADOQuery1->Parameters->ParamByName("waveform")->LoadFromFile("c:\\temp\\temp.seed",ftBlob);
其中檔案temp.seed是標準的512位元組長,但寫入資料庫后欄位長度就增加了2個位元組(0D 0A),每行資料都是這樣。請問如何才能保證使用LoadFromFile方法讀的資料就是檔案的長度512呢?煩請高人幫幫我呀!
bcb6.0 服務器mysql
uj5u.com熱心網友回復:
ADOQuery1->Edit();
TBlobField *bf = (TBlobField *)ADOQuery1->FieldByName("waveform");
TADOBlobStream *bs = new TADOBlobStream(bf, bmWrite);
bs->Seek(0, soFromBeginning);
bs->LoadFromFile("c:\\temp\\temp.seed");
ADOQuery1->Post();
delete bs;
uj5u.com熱心網友回復:
版主妖哥好,先謝謝您的熱情幫助。我的按照妖哥的方法做了,我源代碼是使用ADO的引數ParamByName賦值的,inser里欄位原有23個之多,如果按照妖哥的FieldByName改動量大,我仍按照ADO的Parameters來做的,簡化了一些欄位,只用2個欄位來說明。具體代碼如下:
void __fastcall TForm1::write_DB(SEED_data_record *seed_data_record)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text="insert into waveform_con (id,Waveform) values(:t1,:t20)";
ADOQuery1->Parameters->ParamByName("t1")->Value =1;
TBlobField *bf = (TBlobField *)ADOQuery1->Parameters->ParamByName("t20");
TADOBlobStream *bs = new TADOBlobStream(bf, bmWrite);
bs->Seek(0, soFromBeginning);
bs->LoadFromFile("c:\\temp\\temp.seed");
ADOQuery1->ExecSQL();
delete bs;
}
按照上述的代碼運行到
TADOBlobStream *bs = new TADOBlobStream(bf, bmWrite);
這句就出了問題,我不知道出錯的原因在哪兒?還需要高人來幫我。
出錯提示:
---------------------------
seedp
---------------------------
Access violation at address 6D614E04. Read of address 6D614E04.
---------------------------
確定
---------------------------
uj5u.com熱心網友回復:
怎么沒人幫助了呢?高人來幫我呀!我是做資料流的,blob欄位里的長度是固定的512位元組。現在多了“0D 0A”,沒有解決,著急呀。我今天按照妖哥的方法重新寫了程式,還是沒有解決。我想可能是ADOQuery1->Parameters->ParamByName("waveform")->LoadFromFile()方法不適合,請問高人還要有別的方法寫blob的嗎?
uj5u.com熱心網友回復:
你這個blog欄位要存盤的資料,0d 0a 后面是不是0x0的字符?這樣的話,如果按文本來處理,就只有前面回車換行這兩個位元組。uj5u.com熱心網友回復:
妖哥好。就是多了兩個回車換行符。不應該按文本檔案處理,我不知道還應該怎么處理這個問題。
我在網上看到了其他的方法,似乎適合我的要求,就是TBlobSTream* TemplateStream;但按下面的做法通不過編譯,總出問題。
……
#include <DBTables.hpp>
#include <adodb.hpp>
#include <dbtables.hpp>
void __fastcall TForm1::write_DB(SEED_data_record *seed_data_record)
{
……
TBlobSTream* TemplateStream;
ADOQuery1->Open();
ADOQuery1->Edit();
ADOQuery1->Append();
sprintf(no_temp,"%05d",ADOQuery1->RecordCount+1);
ADOQuery1->FieldByName("id")->Value=https://bbs.csdn.net/topics/no_temp;
TemplateStream=new TBlobStream((TBlobField*)ADOQuery1->FieldByName("Waveform"),bmReadWrite);
TemplateStream->Write((char *)seed_data_record, 512);
……
ADOQuery1->Post();
}
為啥我已經包含了TBlobSTream所需的頭段檔案后,在編譯時仍顯示沒有定義TBlobSTream呢?
【C++ Error】 E2451 Undefined symbol ‘TBlobSTream’
TBlobSTream究竟在哪個頭段里呢?
uj5u.com熱心網友回復:
我之前把圖片分割成幾個檔案的時候,內容也被添加了0D 0A,到現在也不知道是什么原因,估計跟你這個原因一樣uj5u.com熱心網友回復:
在網上看到別人同樣的問題,他是這樣解決的:TBlobStream* TemplateStream =(TBlobStream*) ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("Waveform"),bmReadWrite);
不知為啥,反正這樣就行了。我也按此辦理了。
但是
ADOQuery1->FieldByName("id")->Value=https://bbs.csdn.net/topics/no_temp;
TemplateStream->Write((char *)seed_data_record, 512); //seed_data_record是標準的512位元組流資料
……
ADOQuery1->Post();
……
blob型別的Waveform欄位并沒有被寫進資料,是哪里出了錯誤?請高人指點!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/134338.html
標籤:數據庫及相關技術
上一篇:使用控制元件報錯
下一篇:求大神
