全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3804
推到 Plurk!
推到 Facebook!

請問如何將excel檔存入Ms Sql table中

答題得分者是:max5020
mitchellhu
一般會員


發表:22
回覆:51
積分:14
註冊:2007-06-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-05-06 12:25:56 IP:123.204.xxx.xxx 訂閱
 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); //這是第一個問題的所在
//在編譯出現錯誤訊息: [DCC Error] Unit1.pas(45): E2010 Incompatible types: 'TBlobStream' and 'TStream'
//這怪事了:
http://docwiki.embarcadero.com/VCL/en/DBTables.TBlobStream.Create 這中間有提到 Different types of dataset use different classes of BLOB streams. It is //usually a better idea to call the dataset's CreateBlobStream method than to call the BLOB stream constructor.
// 顯然 ADODataSet1.CreateBlobStream(ADODataSet1.FieldByName('xlsfile'), bmWrite) 的型態是TBlobStream啊,怎會被判定成為TStrem(雖然TStream是祖類別)
// 為什麼呢?後來我用笨方法強制型態 TBlobSteam(ADODataSet1.CreateBlobStream(ADODataSet1.FieldByName('xlsfile'), bmWrite)),如此,雖然編譯OK,但總是覺旳這樣作
// 很蠢........

blob.Seek(0, soFromBeginning);
fs := TFileStream.Create('c:\aaaa.xls', fmOpenRead or fmShareDenyWrite);
try
blob.CopyFrom(fs, fs.Size)//第二個有問題的地,這看來是自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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-05-07 08:37:38 IP:114.32.xxx.xxx 未訂閱
您好,

搜一下 blob 看有無您想要的

------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
mitchellhu
一般會員


發表:22
回覆:51
積分:14
註冊:2007-06-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-05-07 14:00:52 IP:123.204.xxx.xxx 訂閱
 感謝 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
資深會員


發表:26
回覆:275
積分:320
註冊:2003-06-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-05-11 16:18:07 IP:59.125.xxx.xxx 訂閱
我倒是不知道, 
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
一般會員


發表:22
回覆:51
積分:14
註冊:2007-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-05-12 13:24:54 IP:123.204.xxx.xxx 訂閱
感謝max大大的指導
我先結案,來測試。
基本我的需求問題還不少,等我再深入的研究後,再請教各位先進。
感謝!
系統時間:2017-10-21 21:50:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!