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 渠上月 閱讀(407) 評論(0)  編輯  收藏 所屬分類: sql (sqlServer)
          主站蜘蛛池模板: 米脂县| 环江| 手游| 九江市| 青浦区| 宿松县| 荆州市| 荆门市| 凤台县| 伊春市| 金门县| 静乐县| 射洪县| 铅山县| 密云县| 巧家县| 麻江县| 永泰县| 香河县| 永平县| 凤阳县| 军事| 那坡县| 嵊泗县| 齐齐哈尔市| 辽宁省| 什邡市| 松桃| 阿克陶县| 宁阳县| 志丹县| 广南县| 江安县| 宣汉县| 应城市| 林甸县| 黔东| 建始县| 滨海县| 定襄县| 达州市|