blog.Toby

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            130 隨筆 :: 2 文章 :: 150 評論 :: 0 Trackbacks
          MOSS的Excel Services相信大家都聽說過.我們可以創建一個引用了外部數據的Excel文件,然后發布到Excel Services中,然后就可以讓用戶在網頁上看到數據庫中的數據的實時的狀態.

          我們會有這樣的設想,我在Excel中設計一個計算邏輯,然后從數據庫中取一些值出來,填到Excel中,然后讓Excel 自動去計算,然后我們可以把計算分析后的結果呈現給擁護.恩,這個設想很好!我們要實現這個想法需要做三件事情:

          1)我們要能從數據庫中取出特定的數,可能需要取到某一個數
          2)我們需要Excel Services能支持我們直接查數據庫
          3)我們把設計好的Excel發布出去

          第一件事情我們自然想到了SQL語句比如"Select value  From table..."之類.
          很遺憾,Excel Services不支持直接查詢數據庫,只支持SQL Server Analysis Services等間接的方式,可能是處于安全或者其他考慮,對于不了解SQL Server Analysis Services的兄弟來說就很難了  : (

          這么一個好的設想,難道就實現不了嗎?慶幸的是,Excel Services支持Udf用戶自定義函數,我們可以通過用戶自定義函數開發一個直接查數據庫的Udf,使用我們熟悉的SQL語句.

          Udf的開發過程:
          1)VS2005新建一個類工程,應用經典目錄下 12/ISAPI/Microsoft.Office.Excel.Server.Udf.dll
          2)編寫自定義的函數
          3)注冊Udf

          關于Udf中的支持的返回值類型等可以參考: http://officeblogs.net/excel/UDFs%20for%20Excel%20client%20and%20server.doc

          SQLExcuteUdf是為實現了一個方法取數據庫中的某個值而設計的:
          using System;
          using System.Collections.Generic;
          using System.Text;
          using System.Data;
          using Microsoft.Office.Excel.Server.Udf;
          using System.Data.SqlClient;

          namespace SQLExcuteUdf
          {
              [UdfClass]
              
          public class SQLExcute
              
          {
                  
          /// <summary>
                  
          /// 取SQL Server數據庫中的單個值
                  
          /// </summary>
                  
          /// <param name="constr">數據庫鏈接</param>
                  
          /// <param name="comstr">SQl語句</param>
                  
          /// <returns></returns>

                  [UdfMethod]
                  
          public string GetSingleDataFromSQL(string constr, string comstr)
                  
          {
                      
          try 
                      
          {
                          
          string tempstring = "無數據";
                          SqlConnection mycon 
          = new SqlConnection(constr);
                          mycon.Open();
                          SqlCommand mycom 
          = new SqlCommand(comstr, mycon);
                          SqlDataReader myreader 
          = mycom.ExecuteReader();
                          
          if (myreader.Read())
                          
          {
                              tempstring 
          = myreader[0].ToString();
                          }

                          mycon.Close();
                          mycon.Dispose();
                          
          return tempstring;
                      }

                      
          catch (Exception ex)
                      
          {
                          
          return "運行錯誤,錯誤:"+ex.Message;
                      }

                  }

              }

          }

          編譯把dll進行注冊

          根據Udf的設計,需要給函數提供一個數據庫連接和SQL語句,在Excel中我是需要用這個Udf查數據庫中某個值,直接在某個單元格輸入函數"=GetSingleDataFromSQL($A$1,B4)".因為Excel不知道這個函數所以在這里會顯示"#Name!"之類的東西,如果把Udf作成xll放到Excel中就能直接在Excel中用了,這里就不做介紹了. 

          然后,我把這個發布到Excel Services中.
          當我在瀏覽器中訪問的時候,Excel Services就會利用Udf去數據庫中查到一個值,顯示出來,當數據庫中數據有更新的時候,刷新頁面會實時更新數據.


          這里下載源代碼.

          預告:
          如何利用Excel Services取實數據作為KPI列表數據源
          posted on 2009-03-04 21:25 渠上月 閱讀(406) 評論(0)  編輯  收藏 所屬分類: sql (sqlServer)
          主站蜘蛛池模板: 马公市| 长春市| 肥城市| 黄骅市| 特克斯县| 隆回县| 区。| 宁城县| 庆安县| 福安市| 长宁县| 康马县| 镇雄县| 晋宁县| 伽师县| 基隆市| 卓尼县| 泸水县| 津南区| 榆林市| 界首市| 临汾市| 教育| 井陉县| 炉霍县| 舒兰市| 汤原县| 通辽市| 张家川| 喜德县| 炉霍县| 璧山县| 仙游县| 南川市| 府谷县| 安福县| 沐川县| 吴忠市| 海城市| 南汇区| 灵丘县|