摘 要:本文論述了從Excel文件到SQL Server的數(shù)據(jù)遷移過(guò)程,并根據(jù)數(shù)據(jù)導(dǎo)入流程進(jìn)行分析并給出了關(guān)鍵代碼。
關(guān)鍵詞:Excel;SQL Sever數(shù)據(jù)庫(kù);數(shù)據(jù)遷移
中圖分類(lèi)號(hào):TP311.13
在目前的各種管理系統(tǒng)中,其后臺(tái)數(shù)據(jù)庫(kù)由于開(kāi)發(fā)工具選擇的原因可能有所不同[1]。在數(shù)據(jù)管理和遷移過(guò)程中,可以利用原系統(tǒng)先將數(shù)據(jù)輸出到Excel數(shù)據(jù)表中,Excel文件利于數(shù)據(jù)的傳遞和交換,然后再導(dǎo)入到管理系統(tǒng)數(shù)據(jù)庫(kù)中的方法來(lái)進(jìn)行數(shù)據(jù)遷移和格式的轉(zhuǎn)換。常規(guī)的Excel數(shù)據(jù)導(dǎo)入導(dǎo)出到SQL Server,可以使用“SQL Server Data Transformation Services(DTS)導(dǎo)入向?qū)А被颉癝QL Server導(dǎo)入和導(dǎo)出向?qū)А边M(jìn)行數(shù)據(jù)的遷移。Excel數(shù)據(jù)導(dǎo)入步驟如下:①選擇要操作的數(shù)據(jù)庫(kù),單擊右鍵,在彈出的菜單中選擇“任務(wù)”子菜單中的“導(dǎo)入數(shù)據(jù)”菜單;②在選擇數(shù)據(jù)源對(duì)話框中,選擇Microsoft Excel,然后輸入Excel文件路徑及名稱(chēng)或通過(guò)瀏覽按鈕定位Excel文件;③在選擇目標(biāo)對(duì)話框中,選擇Microsoft OLE DB Provider for SQL Server,數(shù)據(jù)庫(kù)選擇要導(dǎo)入的數(shù)據(jù)庫(kù)名稱(chēng);④選擇復(fù)制一個(gè)表或多個(gè)表或多個(gè)視圖的數(shù)據(jù),選擇Excel源表時(shí),附加$的Excel對(duì)象名稱(chēng)代表工作表,沒(méi)有附加$普通對(duì)象名稱(chēng)代表Excel指定的范圍[2]。SQL Server數(shù)據(jù)庫(kù)的數(shù)據(jù)導(dǎo)出到Excel文件過(guò)程與導(dǎo)入過(guò)程基本一致,但是對(duì)于非專(zhuān)業(yè)的管理人員來(lái)說(shuō),更需要開(kāi)發(fā)人員提供Excel數(shù)據(jù)直接導(dǎo)入導(dǎo)出到SQL Server的數(shù)據(jù)操作功能,因此通過(guò)使用編程的方法來(lái)實(shí)現(xiàn)數(shù)據(jù)遷移就非常必要。
1 數(shù)據(jù)導(dǎo)入流程
圖1 數(shù)據(jù)導(dǎo)入流程
數(shù)據(jù)轉(zhuǎn)換首先將基礎(chǔ)數(shù)據(jù)從管理系統(tǒng)中輸出到Excel數(shù)據(jù)文件中,然后將Excel數(shù)據(jù)文件上傳導(dǎo)服務(wù)器中。在上傳Excel數(shù)據(jù)文件后,將Excel數(shù)據(jù)文件看作數(shù)據(jù)庫(kù),其中的工作表看作數(shù)據(jù)表,使用標(biāo)準(zhǔn)的SQL語(yǔ)句讀取其中的數(shù)據(jù)到OleDBDataAdapter中,然后將數(shù)據(jù)再插入SQL Server數(shù)據(jù)庫(kù)[3],數(shù)據(jù)導(dǎo)入流程如圖1所示。
2 Excel數(shù)據(jù)文件上傳處理
在上傳Excel數(shù)據(jù)文件到服務(wù)器時(shí),首先需要判斷上傳的文件是否為空并且其后綴名為.xls。為了保證其文件名稱(chēng)的唯一性,使用日期時(shí)間+隨機(jī)值作為上傳Excel文件的名字,相關(guān)代碼如下:
Random rd = new Random(1);
string filename = DateTime.Now.Date.ToString(\"yyyymmdd\") + DateTime.Now.ToLongTimeString().Replace(\":\", \"\") + rd.Next(9999).ToString() + \".xls\";
//將上傳的Excel文件將保存在網(wǎng)站目錄下的file文件夾中
File1.PostedFile.SaveAs(@Server.MapPath(\"../file/\") + filename);
3 Excel數(shù)據(jù)讀取到數(shù)據(jù)集中
在Excel數(shù)據(jù)文件保存到服務(wù)器后,將Excel數(shù)據(jù)文件看作數(shù)據(jù)庫(kù)并建立數(shù)據(jù)連接,然后將Excel中的工作表看作數(shù)據(jù)表并執(zhí)行SQL查詢(xún)命令,最后將選擇Excel數(shù)據(jù)表的數(shù)據(jù)獨(dú)到數(shù)據(jù)集中,相關(guān)代碼如下:
string conn = \"Provider = Microsoft.Jet.OLEDB.4.0;Data Source =\" + Server.MapPath(\"../file\") + \"/\" + filename + \";Extended Properties=Excel 8.0\";
OleDbConnection thisconnection = new OleDbConnection(conn);
thisconnection.Open();
string Sql = \"select * from [data$]\";
OleDbDataAdapter mycommand = new OleDbDataAdapter(Sql, thisconnection);
//創(chuàng)建數(shù)據(jù)集并將數(shù)據(jù)讀取進(jìn)來(lái)
DataSet ds = new DataSet();
mycommand.Fill(ds, \"[data]\");
thisconnection.Close();
4 遍歷數(shù)據(jù)集并插入數(shù)據(jù)表
在ds數(shù)據(jù)集中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)相關(guān)表之前,可以先遍歷ds數(shù)據(jù)集中的記錄是否已存在于數(shù)據(jù)庫(kù)中,可以執(zhí)行SQL 語(yǔ)句:select count(*) from 數(shù)據(jù)表 where查詢(xún)記錄條件,如果執(zhí)行后的記錄數(shù)為0,則表明數(shù)據(jù)庫(kù)中不存在相關(guān)記錄,可以插入數(shù)據(jù)庫(kù)[4],相關(guān)代碼如下
//計(jì)算記錄數(shù)并遍歷數(shù)據(jù)集
int count = ds.Tables[\"[data]\"].Rows.Count;
SqlConnection con = dataconn.getcon();
con.Open();
for (int i = 0; i < count; i++)
{
字段值1 = ds.Tables[\"[data]\"].Rows[i][\"字段名1\"].ToString();
…
字段值N = ds.Tables[\"[data]\"].Rows[i][\"字段名N\"].ToString();
//如果該記錄不存在,則將數(shù)據(jù)集中的字段值組合起來(lái),插入到SQL Server數(shù)據(jù)庫(kù)中
string excelsql = \"insert into 數(shù)據(jù)表(字段名1,…,字段名N)values('\" +字段值1 + \"', … '\" +字段值N+ \"')\";
dataconn.eccom(excelsql);
}
5 總結(jié)
SQL Server中的數(shù)據(jù)導(dǎo)出Excel文件,首先建立Excel模版文件,然后在工程中引用Microsoft Excel11.0 Object Library,根據(jù)SQL數(shù)據(jù)庫(kù)內(nèi)容使用代碼寫(xiě)入Excel模版文件,然后另存為Excel數(shù)據(jù)文件,最后供用戶(hù)下載。Excel數(shù)據(jù)導(dǎo)入導(dǎo)出技術(shù)是方便用戶(hù)將數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行遷移的有效途徑,本文實(shí)現(xiàn)了將Excel文件中的數(shù)據(jù)導(dǎo)入到SQL Server數(shù)據(jù)庫(kù)并給出了關(guān)鍵的相關(guān)代碼,為軟件開(kāi)發(fā)人員及數(shù)據(jù)庫(kù)管理人員提供了一定的參考價(jià)值。
參考文獻(xiàn):
[1]傅清平.異構(gòu)數(shù)據(jù)庫(kù)中數(shù)據(jù)轉(zhuǎn)換技術(shù)[J].江西煤炭科技,2004(3):55-57.
[2]Microsoft.如何將數(shù)據(jù)從Excel導(dǎo)入到SQL Server[EB/OL].http://support.microsoft.com/default.aspx?scid=kb,zh-cn:2013-8-31.
[3]王平勤,董付國(guó).asp.net/c#實(shí)現(xiàn)excel與SQL Server數(shù)據(jù)遷移技術(shù)研究[J].福建電腦,2008,14(3):184-185.
[4]尹幫治.基于VC# 的Excel表格與SQL Server數(shù)據(jù)庫(kù)的批量數(shù)據(jù)導(dǎo)入導(dǎo)出技術(shù)研究[J].企業(yè)技術(shù)開(kāi)發(fā),2008,27(8):13-16.
[5]張麗英.基于.NET的Excel數(shù)據(jù)批量導(dǎo)入SQL Server的設(shè)計(jì)與實(shí)現(xiàn)[J].南通紡織職業(yè)技術(shù)學(xué)院學(xué)報(bào)(綜合版),2012,12(1):7-10.
作者簡(jiǎn)介:張紅瑞(1978-),女,河北定州人,講師,碩士,主要研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò)、計(jì)算機(jī)視覺(jué)。