本文通過一個實例概要講解如何在ASP.NET程序中配合SQL Server2000進行word文件的存儲和調用過程(沒有使用VBA )。
(1) 建立數據庫
首 先,我們在數據庫中建立一個表,表中有三個字段,fileName(varchar,50),postTime(datetime,8), fileContent(image,16),分別存儲文件名稱,上傳時間和word文件的具體內容,其中fileName爲主鍵。具體的SQL腳本如 下:
CREATE TABLE [dbo].[word] (
[fileName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[postTime] [datetime] NOT NULL ,
[fileContent] [image] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
(2) 上傳並存儲word文件
在VS.NET中建立一個ASP.NET web應用程序,在界面內加入如下控件
控件類型
|
ID
|
Text
|
說明
|
Label
|
Label1
|
請輸入文檔的標題
|
|
Label
|
Label2
|
請選擇具體文檔
|
|
File Field
|
File1
|
|
上傳控件(要將此HTML控件轉化爲服務器控件)
|
TextBox
|
name_TextBox
|
|
用於錄入文檔標題
|
Button
|
Btn_OK
|
上傳文件
|
|
Button
|
Btn_get
|
讀取文件
|
|
HyperLink
|
HyperLink1
|
打開
|
用於打開word文檔
|
上傳文件時首先通過上傳控件找到所需上傳的文件,然後獲取文件的大小,最後以流的形式寫入數據庫,具體代碼爲:
private void Btn_OK_Click(object sender, System.EventArgs e)
{
string name=name_TextBox.Text;
//接收上傳文件
Stream fileStream=File1.PostedFile.InputStream;
//獲取上傳文件字節的大小
int length=File1.PostedFile.ContentLength;
byte[] wordData=new byte[length];
//從流中讀取字節並寫入wordData
int n=fileStream.Read(wordData,0,length);
//獲取當前時間
DateTime time=DateTime.Now;
//連接數據庫
SqlConnection conn=new SqlConnection();
conn.ConnectionString="workstation id=TIANCHUNZHU;packet size=4096;integrated security=SSPI;data source=TIANCHUNZHU;persist security info=False;initial catalog=test";
SqlCommand cmd=new SqlCommand();
cmd.Connection=conn;
cmd.CommandText="INSERT INTO word (fileName,postTime,fileContent) values (@fileName,@postTime,@fileContent)";
SqlParameter nameParam=new SqlParameter("@fileName",System.Data.SqlDbType.VarChar,50);
nameParam.Value=name;
cmd.Parameters.Add(nameParam);
SqlParameter timeParam=new SqlParameter("@postTime",System.Data.SqlDbType.DateTime,8);
timeParam.Value=time;
cmd.Parameters.Add(timeParam);
//添加word文件
SqlParameter contentParam=new SqlParameter("@fileContent",System.Data.SqlDbType.Image); ①//見本段最後註解
contentParam.Value=wordData;
cmd.Parameters.Add(contentParam);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
注①:此處由於是Image類型文件,事先可能無法預測文件的大小,因此可不必指定size參數。如果希望控制上傳文件的大小則可以輸入size參數。如指定1000,則上傳時最大可以上傳1k的word文檔。
(3) 從數據庫中讀取數據並恢復爲word文件
讀 取數據時先將數據從數據庫中讀入緩衝區,然後再從緩衝區寫入最終文件。因此首先要開闢一個緩衝區並設定它的大小,每當緩衝區讀滿時就要將緩衝區內的數據寫 入文件,以清空緩衝區並繼續向緩衝區讀數據,直到最後一次將緩衝區內剩餘的數據全部寫入文件,新的word文檔即可生成。
由於這一部分用到了字節流的輸入輸出操作,因此要引用System.IO命名空間
下面是關於這一部分的完整代碼:
private void Btn_get_Click(object sender, System.EventArgs e)
{
//連接數據庫
SqlConnection conn=new SqlConnection();
conn.ConnectionString="workstation id=TIANCHUNZHU;packet size=4096;integrated security=SSPI;data source=TIANCHUNZHU;persist security info=False;initial catalog=test";
SqlCommand cmd=new SqlCommand();
cmd.Connection=conn;
//根據TextBox中指定的文件名進行查找讀取
cmd.CommandText="select fileContent from word where fileName='"+name_TextBox.Text.ToString()+"'";
FileStream fs;
BinaryWriter bw;
//設定允許讀取到緩衝區的最大長度
int buffersize=100;
//要將字節流讀入的緩衝區
byte[] outbyte=new byte[buffersize];
//用於記錄已經讀取的字節數
long reval;
//字段中的索引,從這裏開始讀取操作
long startIndex;
//FileStream對象將封裝的文件的相對路徑或絕對路徑
string filePath=@"C:/wordData.doc";
conn.Open();
SqlDataReader reader;
reader=cmd.ExecuteReader();
while (reader.Read())
{
fs=new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.Write);
bw=new BinaryWriter(fs);
startIndex=0;
//將字節流讀入outbyte緩衝區中並返回讀取的字節數
reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize);
//當讀取的字節流達到緩衝區允許的最大長度時要卸載緩衝區內的數據並將數據寫入文件
while (reval==buffersize)
{
bw.Write(outbyte);
bw.Flush();
//重新設定開始讀取的位置,並繼續讀取和寫數據
startIndex+=buffersize;
reval=reader.GetBytes(0,startIndex,outbyte,0,buffersize);
}
//將緩衝區內最後剩餘的數據寫入文件
bw.Write(outbyte,0,(int)reval-1);
bw.Flush();
bw.Close();
fs.Close();
}
reader.Close();
conn.Close();
}
此時將按照filePath中指定的路徑和名稱重新生成word文檔。可以在filePath中根據具體情況指定生成的word文檔的名稱和路徑。
(4) 打開word文檔
在打開word文檔這一部分暫時並沒有找到通過Button按鈕直接打開word的有效辦法,但我們可以HyperLink控件,只要將HyperLink控件的NavigateUrl屬性指向word文檔的物理路徑就可以了。