表a 有(id,name, wj) 3個欄位,比如想插入 (1,‘王偉’ , c:\y.rar )(注意,是檔案本身,不是檔案名的字符) 到記錄中,陳述句應該如何寫呢?
uj5u.com熱心網友回復:
檔案格式是txt還是raruj5u.com熱心網友回復:
是rar 的檔案格式uj5u.com熱心網友回復:
使用引數, 如果是 ADOADOQuery->SQL->Add("INSERT INTO a (id,name, wj) ");
ADOQuery->SQL->Add("VALUES (1, '王偉', :V_FILE)");
ADOQuery->Parameters->ParamByName("V_FILE")->LoadFromFile("c:\\y.rar", ftBlob);
ADOQuery->ExecSQL();
uj5u.com熱心網友回復:
這個除了引數法直接載入檔案外我習慣于使用流來上傳檔案,例子代碼如下:void __fastcall TForm1::Button1Click(TObject *Sender)
{//存入
AnsiString tPath;
OpenDialog1->Filter="Word 檔案 (*.doc)|*.doc|Microsoft Excel 作業簿 (*.xls)|*.xls|Web 頁 (*.htm;*.html)|*.htm;*.html|所有檔案|*.*";//顯示的檔案型別
if(OpenDialog1->Execute())//打開檔案對話框
tPath=OpenDialog1->FileName;//把檔案讀取到Memo控制元件中
else return;
TMemoryStream *sm=new TMemoryStream;
sm->LoadFromFile(tPath);//源流
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("INSERT INTO b1(l1,l2) VALUES('123',:l2);");
ADOQuery1->Parameters->ParamByName("l2")->LoadFromStream(sm, ftBlob);
ADOQuery1->ExecSQL();
delete sm;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{//取出
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("SELECT * FROM b1;");
ADOQuery1->Open();
if(ADOQuery1->Eof)return;//回傳
TStream *Stream1;
Stream1=ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("l2"), bmRead);
TMemoryStream *sm=new TMemoryStream;
sm->LoadFromStream(Stream1);
sm->SaveToFile("C:\\1.xls");
delete sm;
delete Stream1;
}
這個例子有個明顯的問題就是流沒有重用,在連續的、大量的上傳檔案時將造成問題,解決方法是把流的創建和銷毀移到按鈕事件外面
有一個比較好的建議是,SQLServer2000據我的專案經驗,其資料檔案超過2T沒有問題,但對于大檔案或超大檔案的上傳,如果直接上傳整個檔案到一個欄位里將帶來一些問題,此時可以用流分塊上傳。
uj5u.com熱心網友回復:
最終版本:TMemoryStream * K_MLEG;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
K_MLEG = new TMemoryStream();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
K_MLEG->Clear();
delete K_MLEG;
K_MLEG=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // 存檔案到資料庫
OpenDialog1->Filter=L"Word 檔案 (*.doc)|*.doc|Microsoft Excel 作業簿 (*.xls)|*.xls|Web 頁 (*.htm;*.html)|*.htm;*.html|所有檔案|*.*"; // 顯示的檔案型別
if(OpenDialog1->Execute()!=true){ // 打開檔案對話框
return;
}
String Path=OpenDialog1->FileName; // 把檔案讀取到Memo控制元件中
K_MLEG->Clear(); // 使用前先清空
K_MLEG->LoadFromFile(Path); // 源流
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(L"INSERT INTO b1(l1,l2) VALUES('123',:l2);");
ADOQuery1->Parameters->ParamByName(L"l2")->LoadFromStream(K_MLEG, ftBlob);
ADOQuery1->ExecSQL();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // 從資料庫中下載
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(L"SELECT * FROM b1;");
ADOQuery1->Open();
if(ADOQuery1->Eof){
return; // 回傳
}
TStream * Stream1;
Stream1=ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName(L"l2"), bmRead);
K_MLEG->Clear(); // 使用前先清空
K_MLEG->LoadFromStream(Stream1);
K_MLEG->SaveToFile(L"C:\\1.xls");
delete Stream1;
}
uj5u.com熱心網友回復:
關注學習一下轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/111520.html
標籤:數據庫及相關技術
下一篇:FireBird如何存取圖片
