asp.net|word|程式
本文通過一個執行個體概要講解如何在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文檔的實體路徑就可以了。