請問如何將excel檔存入Ms Sql table中 |
答題得分者是:max5020
|
mitchellhu
一般會員 ![]() ![]() 發表:23 回覆:53 積分:15 註冊:2007-06-12 發送簡訊給我 |
Google 很久,看到的都是講如何將excel的各sheet內容,以csv格式逐筆存入table中(好像大部份都是網頁式的解決方案)。
我的需求不是這樣的,而是要將完整的 xxx.xls的excel存入table中。 我最大的問題(還蠻蠢的)是,看起來無法 直接在sql server上下insert into YYY values(xxx.xls); 所以我猜xxx.xls先轉成binary file, 才可以存入table中,這樣對嗎?(附帶一問,xxx.xls 是binary file 嗎?) 再來一個蠢問題是,xxx.xls 是存於某一目錄下的,在insert 時 values('xxxx.xls') ,這個'xxxx.xls要用路徑加檔名嗎?但是這時存入的應該是路徑 檔名字串而已, 那究竟如何才能帶入實體的xxx.xls存入table中呢? 用程式開一個buffer變數,先buffer read xxx.xls 再將buffer insert 進去這樣對嗎? 小弟對於這樣的需求 完全無經驗,期待各位有經驗的先輩,給予指點 感謝 =============================================================================================================== 剛又在google上看到1篇http://delphiheaven.blogspot.com/2007/03/save-file-to-tblobstream-and-read-it.html 是講如何拿任何形態的檔案,存入/取出Ms sql 的blob型態資料欄中。於是就依樣修成我要的存取xls檔的需求。 由於 Ms sql 2005 上Blob type 已不存在,所以我的table中存放 xls檔的欄位型態是varbinay(MAX),而這個table目前也僅有此一欄位叫xlsfile 我試著作個將xls存入 xlsfile欄的button, 但確發生了問題。程式碼如下: procedure TForm1.Button2Click(Sender: TObject); var blob: TBlobStream; fs : TFileStream; begin ADODataSet1.Active := True; try ADODataSet1.Edit; blob := ADODataSet1.CreateBlobStream(ADODataSet1.FieldByName('xlsfile'), bmWrite);http://docwiki.embarcadero.com/VCL/en/DBTables.TBlobStream.Create//第二個有問題的地,這看來是自TFileStream copy 到TBolbStream.,但程式在執行上應遇到問題 直接去到 Finall fs.Free,也就是根本沒將xls在入 // xlsfiles欄中,這又是什麼原因呢? finally fs.Free end; finally blob.Free end; end; 針對以上2個問題,請各位指導..................... 謝謝 這個問玩一天了,感覺自已能力真差................ 編輯記錄
mitchellhu 重新編輯於 2010-05-06 18:55:27, 註解 無‧
mitchellhu 重新編輯於 2010-05-06 18:56:48, 註解 無‧ mitchellhu 重新編輯於 2010-05-06 18:57:49, 註解 無‧ |
st33chen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
|
mitchellhu
一般會員 ![]() ![]() 發表:23 回覆:53 積分:15 註冊:2007-06-12 發送簡訊給我 |
感謝 st33Chen的回覆.
今日再論壇中再次找尋相関的資訊,最後參考http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=44990這篇 測試結果可以將xls存取至Ms sql 2005上了 我目前試的code 如下: 1.存入 procedure TForm1.Button2Click(Sender: TObject); var BmpDlg: TOpenDialog; ADOBlobStream: TADOBlobStream; begin bmpDlg := TOpenDialog.Create(nil); try if bmpDlg.Execute then begin if ADODataset1.FieldbyName('xlsfile').IsBlob then begin ADODataset1.Active:=True; ADODataset1.Edit; try TBlobField(ADODataset1.FieldByName('xlsfile')).LoadFromFile(bmpDlg.FileName); ADODataset1.Post; finally end; end; end; finally bmpDlg.Free; end; end;
2取出 procedure TForm1.Button3Click(Sender: TObject); var BmpDlg: TSaveDialog; ADOBlobStream: TADOBlobStream; begin bmpDlg := TSaveDialog.Create(nil); try if bmpDlg.Execute then begin if ADODataset1.FieldbyName('xlsfile').IsBlob then begin ADODataset1.Active:=True; ADODataset1.Edit; try TBlobField(ADODataset1.FieldByName('xlsfile')).SaveToFile(BmpDlg.FileName); ADODataset1.Post; finally end; end; end; finally bmpDlg.Free; end; end; 雖然目前測試OK,但對於其中 TBlobField這個部份了解。 想請教像在論壇中,很多先輩很會查詢或看Delphi本身的source code. 可否請指導如何查詢(方便的話以TBlobFiled為例,我通常都是用google查,但得的資料都不全面,我想應該建立一個正確的方式才能自我改善) 感謝!! |
max5020
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
我倒是不知道,
Delphi有提供, 可以直接匯EXCEL到DB的方法, 但是也常有這樣的需求, 目前已知MS-SQL的管理工具, 有提供EXCEL匯入的工具, 但是還是經常不符使用, 例如: Q1, 匯入時PK重覆 Q2. 已存在的PK, 只要匯入部份資料等等... 因此在無法偷懶的情形下, 自己寫乙支工具, 主要重點如下: 1. 從EXCEL匯入到TClientDataSet 2. 從要匯入的DB中, 挑撰要匯入的Table 3. 選擇ClientDataSet的PK欄位, 對應到Table的PK欄位 4. 選擇ClientDataSet中其他欄位, 對應到Table的其他欄位, 5. 開始RUN, 將每一筆ClientDataSet的資料, 組好SQL Insert指令 當然, 其他匯入時特殊的需求, 就可以做Option選項, 就將子!! 可參考 http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=100871
編輯記錄
max5020 重新編輯於 2010-05-11 17:48:45, 註解 無‧
|
mitchellhu
一般會員 ![]() ![]() 發表:23 回覆:53 積分:15 註冊:2007-06-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |