ASP擅長Web編程,在服務器端操作後臺數據庫,但是用ASP制作實時數據庫圖表有點困難,因為ASP本身不支持圖表功能,只能借助第三方控件開發,比如微軟推出的VB和NET Framework的MSChart控件,很好的解決了這個問題。微軟在. NET平臺上集成了實時數據庫圖表制作組件O。WC(Microsoft Office Web Components)我們可以通過在ASP NET頁面中調用OWC來輕松繪制各種類型的實時圖表。OWC支持近種圖表,包括圖形,折線圖,柱形圖,面積圖和k線圖。與MSChart相比,OWC功能強大且易於操作。另外,由於OWC是基於服務器端的,而MSChart只能應用於客戶端,所以MSChart在服務器端的web開發上不如OWC。
下面,作者將通過壹個例子來闡述OWC在ASP網頁中的應用。本實例是作者開發的“化纖產品及其原料市場分析系統”項目的壹個子系統。作者在這個項目中使用了OWC,充分享受了OWC強大的功能給開發工作帶來的便利。
有三層的東西
系統整體架構采用B/S三層結構模式,將系統分為用戶界面層(也稱表示層)、業務邏輯層(也稱功能層)和數據庫服務層(也稱數據層),開發平臺采用. NET框架,有效降低了系統對客戶端的要求,避免了在客戶端分發應用和版本控制的困難。
●用戶界面層使用ASP . NET技術,ASP . NET技術的應用增強了系統的通用性。客戶端只需安裝IE或Netscape等任何瀏覽器,無需加載任何組件。
●業務邏輯層采用. NET框架調用OWC的技術,可以根據用戶的要求快速獲取數據庫中的數據,並動態生成圖表。該系統能夠支持復雜的檢索條件,檢索速度快,響應時間短。
●數據庫服務層數據庫服務層可以使用任何關系數據庫。在本項目中,作者使用了SQL Server,它可以與. NET框架無縫集成,數據庫訪問技術采用ADO NET。
下面我們將重點介紹業務邏輯層的實現。
圖表元素介紹
壹個完整的圖表是由幾個元素組成的,我們必須對它們有所了解,才能完全自由地隨意控制圖表,更好地理解這個程序。作者制作了壹個簡單的圖表,其中標出了程序中涉及的主要部分和元素的名稱,以幫助讀者掌握OWC和理解本文引用的代碼。
使用OWC組件
本節涉及的源代碼摘自化纖產品及其原料市場分析系統。本系統在windows/XP簡體中文專業版網絡環境下使用OWC組件的步驟如下。
在當前目錄下創建壹個新的子目錄圖表用於存儲圖表文件,同時賦予ASP NET帳戶修改目錄的權限。具體步驟如下:右鍵單擊圖表目錄名稱,選擇properties菜單項,在彈出的圖表屬性對話框中點擊security選項卡,點擊Add按鈕找到ASP . NET賬號,然後點擊OK結束,這樣ASP . NET就可以在圖表目錄中寫入圖表文件了。
定義服務器端圖像圖像控件。圖像的屬性imageURL會在程序的最後指向動態生成的圖表文件,所以這裏不需要給它賦值。
& ltASP image id = img chart Width = Height = Visible = False Runat = server & gt;& lt/ASP image & gt;
添加OWC參考
在使用OWC之前,必須將OWC的引用添加到解決方案資源管理器中。具體步驟如下:打開解決方案資源管理器面板,右鍵單擊引用選擇和添加引用菜單,在彈出的添加引用對話框中點擊卡片找到Microsoft Office Web Components,點擊選擇並確定按鈕,將OWC添加到引用中。
定義OWC空間,並向該空間添加壹個奧查OWC圖表。
Dim owcChartSpace As OWC圖表空間=新OWC圖表空間()
dim owcChart As OWC WC chart = owcChartSpace圖表添加
使用SQL檢索條件檢索數據庫,並將檢索結果以記錄集數據集的形式分配給owcChart。
OWC只支持記錄集數據集,不支持數據集數據集,所以sqlCommand sqlDataAdapter等對象不能用於檢索,只能使用記錄集對象進行檢索。
開放式連接
ConnADO打開(connectionString)
RecordsetADO active connection = ConnADO
將光標設置為靜態光標。
recordset ado CursorType = ADODB CursorType enum adOpenStatic
recordset ado cursor location = ADODB cursor location enum adUseClient
標準的SQL檢索條件存儲在變量strSQL中。
打開記錄集(strSQL)
然後將記錄集數據集賦給OWC對象。
owcChartSpace data source = recordset ado
本例中,我們假設SQL語句檢索到的數據* * *有三個字段,這三個字段的值分別對應圖表中曲線分類(X)軸和數值(Y)軸的數據。
確定曲線類型,並確定區分不同曲線的字段名稱。
首先,確定曲線類型為平滑曲線。
owc chart Type = OWC charttypeenum chChartTypeSmoothLine
OWC支持在同壹個圖表中顯示兩條以上的曲線,所以我們必須給出區分不同曲線的依據。這個基礎就是產品場的價值。具體來說,產品字段中的幾個不同值將生成幾條不同的曲線。
Owc圖表集數據(owc圖表維枚舉chdimseriesomes產品)
確定對應於分類(X)軸標簽和值(Y)軸標簽的字段。
首先,我們需要將owcSeries定義為OWC的曲線集,然後遍歷圖表中的每條曲線,將日期字段的值分配給分類(X軸作為X軸校準標簽),並將價格字段的值分配給數值(Y軸作為Y軸校準標簽)。如果能確定圖表中只有壹條曲線,就可以省略遍歷過程,但這無疑會降低程序的通用性。
Dim系列為OWC WC系列
對於owcChart SeriesCollection中的每個owcSeries
Owc系列setdata (owc圖表維枚舉chdimcategories日期)
Owc系列setdata(owc chartdimeonenum chdimvalues價格)
然後
設置坐標軸的屬性。
這部分代碼通過設置文本內容、顏色、大小、主副刻度線及其標簽、主副網線等來美化圖表。如果讀者對這段代碼中的概念有點模糊,可以參考上壹部分提供的圖表。具體設置方法請參考以下代碼。
首先,axis被定義為坐標軸集合。
將軸標註為OWC軸
導線坐標軸集
對於owcChart軸中的每個軸
顯示軸標題
軸HasTitle =真
首先設置分類(X)軸。
如果軸類型=OWC圖表軸類型
chCategoryAxis然後
軸HasTickLabels = True
顯示x軸校準標簽。
軸位置= OWC圖表軸位置
標簽的顯示位置
坐標軸標題字體顏色=藍色
x軸的標題文本顏色
軸標題字體大小=
x軸的標題文本大小
坐標軸標題標題=日期範圍
x軸的標題文本內容
其他
設置數值(y)軸。
坐標軸主要網格線線條顏色=銀色
Y軸上主網絡線條的顏色
軸MajorTickMarks = OWC圖表TickMarkEnum chTickMarkNone
不顯示Y軸的主要刻度線。
軸HasTickLabels = True
顯示y軸校準標簽
坐標軸標題字體顏色=藍色
y軸標題文本顏色
軸標題字體大小=
y軸的標題文本大小
軸標題Caption=價格(千元/噸)
y軸的標題文本內容
如果…就會結束
然後
以GIF圖像格式輸出圖表,並將圖像文件名分配給圖像控件。
用隨機數生成隨機文件名。
隨機化()
Dim nFileNameSuffix為整數
Dim sFileNameSuffix作為字符串
nFileNameSuffix = * Rnd()
sFileNameSuffix =系統轉換成字符串(nFileNameSuffix)
以gif格式輸出圖表,大小為*。圖表的文件名為polyesterprice_ random number GIF,存儲在chart子目錄中。
owcChartSpace export picture(MapPath(chart/polyester price _)+sfilename suffix+gif gif)
將圖像控件的URL指向圖表文件。
img chart ImageUrl = chart/polyester price _+sfilename suffix+gif
通過以上九個步驟,我們完成了壹個實時數據庫圖表的生成和顯示。這裏需要指出的是,以上九個步驟只是生成壹個圖表必不可少的基本流程。通過設置OWC的其他屬性,可以更好、更精確地控制圖表的生成和顯示,如圖例線的粗細、顏色軸刻度線、標簽顯示頻率網線等。這部分我就不介紹了。請參考本文第四部分的源代碼。
請看下面這段代碼生成的圖表效果。
使最優化
以上文章中實時生成的所有圖表文件都存儲在圖表文件夾中,所以這些文件不會因為文件名隨機而相互重疊。但是隨著時間的推移,越來越多的文件不僅占用了硬盤空間,而且阻礙了管理,降低了性能。可以自動刪除程序中之前的圖表文件嗎?答案是肯定的,只要我們把下面這段話放到代碼文件的Page_Load()函數中,代碼程序運行時就會自動刪除當天之前的文件,這樣當天生成的圖表文件就會壹直保存在圖表文件夾中,從而有效避免文件垃圾。
首先獲取圖表文件夾中的文件列表。
Dim fileEntries() As String =系統IO目錄獲取文件(MapPath( chart))
Dim文件作為字符串
遍歷文件列表
對於fileEntries中的每個文件
將文件的生成日期與系統日期進行比較。如果是在那壹天之前生成的文件,請將其刪除。
if DateTime Compare(System IO File getcreation time(sFile)AddDays()DateTime Now)& lt;然後
系統IO文件刪除(sFile)
如果…就會結束
然後
Lishi Xinzhi/Article/program/net/201311/11850