程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告

使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告

編輯:關於SqlServer

本文假設讀者熟悉 SQL Server 2000 和 VBScriptLevel of Difficulty 123 下載本文的代碼:VBScriptAndSQLServer2000.exe (38 KB)摘要應用程序服務提供商通常必須自動向客戶端發送信息,而不是按需發送。例如,制造商可能希望知道某個連鎖零售店每天賣出了多少他們的產品。盡管 SQL Server 非常適合維護這種類型的數據庫,但是您必須編寫腳本,以便以客戶端友好的格式從中獲取數據。在本文中,您將看到如何使用數據轉換服務(DTS,SQL Server 中一個功能強大的工具),從 SQL Server 2000 自動執行數據檢索和格式設置,並使得向用戶推入數據這一過程變得更加容易。

“推”又被稱作 Web 強制轉換,它自動執行對數據的搜索和檢索。它是由 Web 或數據庫服務器(而非用戶)啟動的。根據所定義的某個標准,無論“推”應用程序何時何地進行定向(經常是通過電子郵件直接定向到用戶的桌面),它都將自動搜索數據庫並提供所需的信息。這不僅能夠方便地接收用戶以其他方式可能無法輕松獲取的重要信息,而且還大大改變了日常業務的運作方式。

“推”應用程序通常有兩種形式。第一種類型包括電子郵件、郵寄名單和直郵服務,這種類型通常是由大型新聞和數據庫組提供的。“推”應用程序還使得開發人員和用戶能夠創建配置文件並記錄他們的首選項,以便他們能夠從多個來源接收相關信息。我們在本文中描述的示例應用程序基於第一種類型的“推”應用程序。但是,我們的應用程序比較通用,同時還足以支持自定義分析功能。

如果各個機構需要集中和合並數據,則可以使用 SQL Server? 2000 中的數據轉換服務 (DTS) 工具,從不同的來源檢索數據並將檢索到的數據轉換為既定渠道的目標。使用這些工具,可以執行簡單的一次性數據轉換,也可以開發復雜的、受工作流驅動的軟件包。DTS 工具還提供一個圖形用戶界面和一個可相對容易進行編程的對象模型。 DTS 軟件包由連接、任務、轉換和工作流約束組成。每個軟件包都可以包含一個或多個步驟或任務,它們可在該軟件包運行時按順序或並行執行。在執行時,該軟件包連接到正確的數據源,復制數據和數據庫對象、轉換數據並將發生的事件通知用戶或進程。您可以對軟件包進行編輯、密碼保護、安排執行時間並按版本檢索。使用 DTS 設計器工具(將在本文的後面部分進行描述)可以方便地創建軟件包。使用 VBScript 或 JScript? 可以創建一個任務,以便執行 DTS 中的其他任務中沒有的功能。例如,可以:

?

創建和使用 ADO 連接、命令、記錄集和其他對象,以便訪問和操作數據

?

使用函數、子例程和 COM 對象設置數據格式並轉換數據

?

創建、使用和修改存儲在 DTS 全局變量和 ActiveX? script 常量中的值

?

集成其他 DTS 任務和工作流

示例應用程序我們的示例應用程序將展示如何使用 VBScript 任務來執行其他 DTS 任務中沒有的功能,以及 VBScript 腳本如何能夠作為已安排任務來運行。由於我們的主要目的是介紹在 SQL Server 2000 中 VBScript 的功能,因此我們將不討論 DTS 全局變量、工作流或者與其他任務的集成。圖 1概述了在開發示例 DTS 應用程序時所遵循的步驟。DTS 軟件包中的 VBScript 任務定期向作者發送有關其圖書銷售情況信息的電子郵件。這些數據的格式被設置為用戶友好的報告。我們將 SQL Server 2000 中的 Pubs 數據庫用作數據源,但是此方法非常通用,可適用於任何數據模型。

使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告(圖一)


圖 1 工作流

第一步是用作者的電子郵件地址填充電子郵件字段。為此,我們選擇了 Pubs 數據庫並通過添加一個大小為 20 的 varChar 字段擴展了 authors 表,並將該字段命名為 au_email,如圖 2 所示。我們假設在生產應用程序中一個單獨的 GUI 或進程將負責填充該字段,但是為了演示的目的,您可以手動輸入這些地址。

使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告(圖二)

圖 2 添加E-mail字段

接著,我們在 SQL Server 2000 中創建了一個新的本地 DTS 軟件包。要打開“DTS 設計器”以創建該軟件包,需要在 SQL Server 中啟動“企業管理器”,在控制台樹中右擊“數據轉換服務”,然後選擇“新建包”,如圖 3所示。使用“DTS 設計器”GUI,通過拖放方法並填寫組成軟件包的各個 DTS 對象的屬性表,可以構建和配置軟件包。

使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告(圖三)

圖 3 創建新的軟件包

第三步是添加 VBScript 任務,方法是將 ActiveX 腳本任務從任務工具欄拖放到設計圖面,如圖 4所示。可以將任務的名稱從“ActiveX 腳本任務:未定義”更改為適用於您的應用程序的名稱。

使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告(圖四)

圖 4 ActiveX 任務屬性

下一步是在 VBScript 任務中開發一些函數,以便檢索數據、轉換數據、將數據通過電子郵件發送給用戶。為了便於浏覽示例應用程序,只需復制示例代碼(請參閱本文頂部的鏈接)中的函數。在“ActiveX 腳本任務屬性”窗口中,確保語言設置為“VBScript 語言”。可通過單擊“語言”按鈕來設置語言(請參閱圖4)。然後將源代碼復制到設計器中,刪除在設計器窗口中看到的默認 Main 函數代碼。 您需要更改 SQL Server 中的常量,使得該示例應用程序適用於您的情況,因為這些常量會發生變化(後面將對此進行解釋)。確保在完成時保存任務,如圖 5所示。我們將軟件包命名為 BookSales。

使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告(圖五)

圖 5 保存軟件包

您可以通過多種方法來運行示例應用程序。首先,單擊“分析”按鈕,確保沒有任何語法錯誤。此按鈕位於“ActiveX 腳本任務屬性”窗口中。然後,在“DTS 設計器”的頂部,單擊工具欄中的“Go”按鈕。或者,可以通過右擊所選任務,並從上下文菜單中選擇“執行”步驟來執行該任務。還可以在“企業管理器”中執行 BookSales 軟件包,如圖 6所示。在成功完成任務時,電子郵件(請參閱圖 7)將發送給作者。

使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告(圖六)

圖 6 運行 BookSales


您正在看的SQLserver教程是:使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告。

通過選擇“調度包”菜單項可以自動安排 BookSales 軟件包的運行時間,如圖 6所示。輸入必需的頻率和持續時間參數。

使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告(圖七)


圖 7 電子郵件調度

為了報告定單號、數量、付款條件和標題,BookSales 軟件包將從 2002 年 1 月 1 日開始,在每天夜裡 11:00 點運行。請注意,必須加載 SQL Server 代理並將其配置為安排 DTS 軟件包的運行時間。在“企業管理器”中“管理|SQL Server 代理|作業”下,應當看到 BookSales 軟件包以作業形式出現。VBScript 代碼所有的示例代碼都位於 sourcecode.txt 文件中,該文件可以隨本文一起下載。在詳述了需要設置的常量並快速浏覽 Main 函數之後,我們將介紹代碼如何管理銷售數據、訪問數據庫、設置記錄集的格式以及發送報告。下面的三個常量必須根據系統和網絡設置進行調整:

>Const SMTP_SERVER = "exchange.afs-link.com"<}0{>Const SMTP_SERVER = "Exchange.afs-link.com"<0>Const SENDER_E-MAIL = """Book Sales Reporting Service""" & _<>Const SENDER_E-MAIL = """Book Sales Reporting Service""" & _<>"<><0>Const DB_CONNECT_STRING = "Provider=SQLOLEDB.1;Data " & _<>Const DB_CONNECT_STRING = "Provider=SQLOLEDB.1;Data " & _<>"Source=(local);Initial Catalog=Pubs;user id = 'sa';password='"<>"Source=(local);Initial Catalog=Pubs;user id = 'sa';passWord='"<

第一個常量 Const SMTP_SERVER = "Exchange.afs-link.com" 是 SMTP 服務器,即郵件服務器的 DNS 名稱。電子郵件發件人函數需要使用此信息來發出電子郵件。網絡管理員將了解到該設置。常量 SENDER_E-MAIL = ""Book Sales Reporting Service" " 是發件人的電子郵件地址。它通常是類似於 [email protected] 的地址。此常量的第一部分 (Book Sales Reporting) 允許您鍵入任何文本;這通常是發送每日銷售報告的部門的名稱。實際的電子郵件地址輸入時必須包含在 <> 中。同樣,網絡管理員應當能夠告訴您在此處輸入什麼內容。最後一個常量是數據庫連接字符串,它提供連接到數據庫所必需的全部信息。ADO 連接字符串看上去如下所示:

Const DB_CONNECT_STRING = "Provider=SQLOLEDB.1;Data " & _



"Source=(local); Initial Catalog=Pubs;user id = " & _



"'sa';passWord='"



我們假設讀者基本掌握 ADO,因此我們只簡要概述了連接字符串各部分的含義。 該字符串的數據庫驅動程序部分為“Provider=SQLOLEDB.1;”,它定義連接到數據庫所必需的 ODBC 驅動程序的類型。我們使用的是 SQL Server;如果您的應用程序使用的不是 SQL Server,則可以在 ASP">Microsoft 開放式數據庫連接中查找必需的 ODBC 驅動程序信息。Data Source 指定要搜索的服務器所在的位置。由於 SQL Server 位於本地計算機上,因此我們指定了 "local"。您可能需要指定數據庫所在計算機的 IP 地址或名稱。Initial Catalog 包含數據庫的名稱;在我們的代碼中,這是 SQL Server 隨附的 Pubs 數據庫。最後,User Id 指定用戶名和用戶密碼。在默認情況下,ActiveX 任務的入口點函數的名稱為 Main,但是您可以更改它。Main 函數只包含兩行。首先,它調用 Process_Daily_Sales 子例程,然後它返回 ActiveX 腳本常量 (DTSTaskExecResult_Success)。在圖 8所示的“包對象浏覽器”中,可以查看所有的項目常量和全局變量。

使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告(圖八)


圖 8 項目常量

這些常量和全局變量可用於控制 DTS 軟件包中各個步驟的執行。為簡化起見,我們將不詳述這些常量和全局變量。有一點很重要,那就是 Main 函數之所以會以 DTSTaskExecResult_Success 形式返回 ActiveX 腳本常量,這是因為我們的示例只是一個由單個步驟組成的 VBScript 任務。管理銷售數據Process_Daily_Sales 函數是應用程序的核心內容。它以記錄集格式檢索今天已售出其圖書的作者列表。然後它將該記錄集的格式設置為 HTML 表,最後它采用這個 Html 表並將其通過電子郵件發送給每個相應的作者。此函數有三個局部變量:兩個 ADO 記錄集和一個日期:

Dim rstAuthors



Dim rstSales



Dim Todays_Date



因為並非所有的 Pubs 數據庫都使用今天的銷售數據進行填充,因此下面的兩行代碼會生成從 1994 年 9 月 14 日開始的報告,之所以選擇該日期,是因為它適用於幾乎所有的 Pubs 數據庫。我們只是取消注釋要處理的代碼行並注釋其他行:

'Todays_Date = "'" & Date() & "'"



Todays_Date = "'9/14/1994'"



接著,我們獲取作者和銷售信息。通過使用簡單的 SQL 聯接,我們選擇其圖書已在今天被訂購的作者:

strAu_Sales = "Select Distinct Authors.* from " & _



"Authors,Sales, TitleAuthor Where " & _



"TitleAuthor.au_id = Authors.au_id   and " & _



"TitleAuthor.Title_id = Sales.Title_id   and " & _



"Sales.ord_date = " & Todays_Date



現在,用以下調用將 SQL 語句轉換成 ADO 記錄集:

Set rstAuthors = ExecuteSQL(strAu_Sales)



接著,在循環訪問以便向作者發送通知之前,確保 rstAuthors 實際上不為空:

If Not (rstAuthors.Eof and rstAuthors.Bof ) Then



While Not rstAuthors.Eof



從各個表(如 Stores、Sales、TitleAuthors 和 Titles)提取其他信息,如下定單的商店、定單號、數量、付款條件和圖書標題。正如您所看到的那樣,這是一個簡單聯接:

strAu_Sales = "SELECT distinct stores.stor_name as [Store Name], " & _


您正在看的SQLserver教程是:使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告。 "sales.ord_num as [Order Number], sales.qty as [Quantity], " & _ "sales.payterms as [Pay Terms], Titles.Title FROM Stores, Sales, " & _ "TitleAuthor, Titles " & "Where TitleAuthor.au_id = '" & _ "rstAuthors("au_id") & "' and Sales.ord_date = " & Todays_Date " & _ " & "and Sales.Title_id = Titles.Title_id and sales.stor_id = " & _ "stores.stor_id "

通過調用 ExecuteSQL 語句將 SQL 語句轉換為 ADO 記錄集:

  Set rstSales = ExecuteSQL(strAu_Sales )



現在,我們用作者的姓名和地址構造消息的正文。之所以使用 HTML 標記 ,是因為我們會將消息以 Html 形式嵌入到電子郵件中:

strTable = rstAuthors("au_fname") & " " &



rstAuthors("au_lname") & "" & rstAuthors("Address")



& "" & rstAuthors("city") & ", " &



rstAuthors("state") & " " & rstAuthors("Zip")



現在,消息的正文已構造完畢,通過包括以前提取的銷售信息,用嵌入的 HTML 表擴展此正文。FormatRecordset 會將 rstSales ADO 記錄集轉換為 Html 表:

strTable = strTable & FormatRecordset(rstSales)



隨後調用 send_e-mail 函數,該函數接受主題、作者的電子郵件地址和 Html 消息正文:

Call send_e-mail("Book Sales Report For: " & _



& Todays_Date, rstAuthors("au_email"), strTable)



然後繼續下一個作者:

rstAuthors.movenext



Wend



Execute_SQL 函數直接連接到數據庫。在該函數內部,我們訪問數據庫,執行由調用方提供的 SQL 字符串,返回結果(如果有的話)。首先創建一個 ADO 連接:

Set myConn = CreateObject("ADODB.Connection")



然後創建一個 ADO 記錄集:

set myRecordset = CreateObject("ADODB.Recordset" )



在下一步中,使用 DB_CONNECT_STRING 常量打開該連接:

myConn.Open = DB_CONNECT_STRING



在該連接打開之後,使用該連接和 SQL 打開此記錄集:

myRecordset.Open MySQLCmdText, myConn



最後,返回打開該記錄集的結果:

Set ExecuteSQL = myRecordset



如果您具有一些 ADO 使用經驗,將會明白所有這些步驟都非常簡單。FormatRecordset 函數以參數形式接受 ADO 記錄集,並(以字符串變量形式)返回 HTML 表。它有兩個循環 ?? 一個循環嵌套在另一個循環中。首先,它逐句通過字段列表,然後依次循環通過各行。這些迭代用於將記錄集轉換為一個 Html 表。

該 Html 表是作為一個字符串創建的,而且有一個簡單表是按如下方式定義的:

strTable = "



隨後轉到第一個記錄並創建帶有 標記的表行:

rstTable.MoveFirst



strTable = strTable & ""



然後循環訪問各個字段並將名稱添加到顏色漂亮的 標記中:

For Index = 0 To rstTable.Fields.Count - 1



strTable = strTable & "<" & _ "font color='white'>" strTable = strTable & _ rstTable.FIElds.Item(Index).Name strTable = strTable & ""



Next



標記是閉合標記;它對表的標題進行標記:

strTable = strTable & "" 

現在,我們繼續記錄集的數據部分,以填充 HTML 表的其余部分。我們依次循環通過所有的記錄並填充 Html 表的 和標記:

While (Not rstTable.EOF)



strTable = strTable & ""



For Index = 0 To rstTable.Fields.Count - 1



strTable = strTable & "" strTable = strTable & _ rstTable(rstTable.FIElds.Item(Index).Name).Value strTable = strTable & "" strTable = strTable & ""



Next



strTable = strTable & ""



rstTable.MoveNext



Wend



最後,該表完成,函數值將作為字符串變量類型返回:

strTable = strTable & "



隨後轉到第一個記錄並創建帶有 標記的表行:

rstTable.MoveFirst



strTable = strTable & ""



然後循環訪問各個字段並將名稱添加到顏色漂亮的 標記中:

For Index = 0 To rstTable.Fields.Count - 1



strTable = strTable & "<" & _ "font color='white'>" strTable = strTable & _ rstTable.FIElds.Item(Index).Name strTable = strTable & ""



Next



strTable = strTable & ""



現在,我們繼續記錄集的數據部分,以填充 HTML 表的其余部分。我們依次循環通過所有的記錄並填充 Html 表的 和 標記:

While (Not rstTable.EOF)



strTable = strTable & ""



For Index = 0 To rstTable.FIElds.Count - 1



strTable = strTable & "" strTable = strTable & _ rstTab


您正在看的SQLserver教程是:使用 SQL Server 2000 中的 VBScript 接口能夠轉換數據並向用戶提供報告。le(rstTable.FIElds.Item(Index).Name).Value strTable = strTable & "" strTable = strTable & "
 "



FormatRecordset = strTable



發送報告Send_Mail 函數用於將報告發送給作者。請注意,此函數中使用的是 SMTP_SERVER 和 SENDER_E-MAIL 常量。Send_Mail 使用 Microsoft? Collaboration 數據對象,這些對象有時是指 CDO 2.0 或 CDOSYS.DLL。CDO 為在 Windows? 2000 上開發消息處理應用程序提供一個對象模型。CDOSYS 基於 SMTP 和 NNTP 標准並且可用作隨 Windows 2000 Server 安裝的系統組件。它是用來在 Windows 2000 Server 上構建批量郵件傳遞和基於 Web 的消息處理應用程序的標准 API。Send_Mail 函數有三個參數:subject、rcpt 和 msgHTML。Subject 是所發送電子郵件的主題,rcpt 是收件人的電子郵件地址,msgHTML 是郵件的 HTML 正文。報告以 Html 格式發送給作者。Send_Mail 函數使用兩個常量。cdoSendUsingPickup 常量表明消息應當使用本地 SMTP Service pickup 目錄來發送。cdoSendUsingPort 常量表明消息使用網絡(通過網絡的 SMTP)發送。如果本地計算機上裝有 SMTP 服務,則該常量的值默認為 cdoSendUsingPickup。否則,如果本地計算機上裝有 Outlook? Express,則該常量的值默認為 cdoSendUsingPort,並且使用默認帳戶的設置。在本文中,我們使用 cDOSendUsingPickup。接著,我們使用 COM 來創建 Message 和 Configuration 對象,如下所示:

set iMsg = CreateObject("CDO歡迎光臨學網,點擊這裡查看更多文章教程 [1] [2] [3] [4] [5] [6] [7]  [8]

.Message") set iConf = CreateObject("CDO.Configuration")

Configuration 有幾個字段。在設置這些字段的值之前,它們都通過如下代碼鏈接到該配置:

Set Flds = iConf.FIElds



http://schemas.microsoft.com/cdo/configuration/ 命名空間定義用於設置各種 CDO 對象配置的大多數字段。我們設置和更新 Configuration 對象的以下三個字段(SendUsing、SMTP_SERVER 和 TimeOut):

With Flds



.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = _



cDOSendUsingPickup



.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _



SMTP_SERVER



.Item("http://schemas.microsoft.com/cdo/configuration/ " & _



"smtpconnectiontimeout") = 10



.Update



End With



最後,在發送消息之前,用剛才定義的配置和其余電子郵件信息對消息進行配置:

With iMsg



Set .Configuration = iConf



.To = rcpt



.From = SENDER_EMAIL



.Subject = subject



.HTMLBody = msgHtml



.Send



End With



結論

在本文中,我們已經介紹了如何使用 SQL Server 2000、VBScript、ADO、CDO 和 DTS 軟件包來實現推入技術。我們的示例非常簡單,但是功能很強大。要對它進行擴展,可以使用復雜的數據模型和外部報告組件來向用戶發送更豐富的報告。還可以將其他 DTS 任務集成到該 VBScript 任務中。此技術可用於將各種各樣的信息(包括及時的財務報表、所采購商品的定單狀態、行業更新或所需的任何其他數據)推向用戶。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved