設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

12345下一頁
返回列表 發(fā)新帖
查看: 25382|回復(fù): 47
打印 上一主題 下一主題

NorthwindCS啟動解讀及高級應(yīng)用示例

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2005-1-28 23:37:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
阿羅 2005年1月27日



初次接觸 ADP,往往被建議從解讀 NorthwindCS 入手。確實,這是個很好的范例。然而,由于很多同學(xué)是從自學(xué) Access-mdb 開始入門的,剛剛開始 ADP 之旅,看到 NorthwindSC 這么復(fù)雜的一個啟動局面,根本就搞不懂這是怎么回事;另外,不排除一些老鳥,雖然可以做一些 ADP 的東西,但是往往局限于手工部署,雖然解讀 NorthwindCS 可以有所提高,由于注釋都是英文,而且定義的常量變量一大堆,看著都覺得累,這樣就失去了進一步提高的機會,很是可惜。本文希望通過對 NorthwindCS 啟動模塊的分析,讓讀者深入體會 ADP 向 SQL Server 連接的設(shè)置和數(shù)據(jù)庫自動化安裝的機理,并且想通過一個作者自己編制的程序來進一步說明如何靈活運用這些剛剛學(xué)到的概念。希望同學(xué)們通過這篇短文,能舉一反三地寫出自己的、更好的 ADP 應(yīng)用程序。





以 Office 2003 為例(下同),NorthwindCS.adp 一般在 C:/program files/Microsoft office/office11/samples/ 目錄中,還應(yīng)該看到一個 northwindCS.sql 數(shù)據(jù)庫腳本文件。對于如何設(shè)置啟動窗體和切換到另一個啟動窗體,就不說了,如果連這個都沒辦法搞明白,那么就不要把時間浪費在這篇文章上了。



現(xiàn)在直接進入正題,“啟動”窗體啟動時,調(diào)用的是“啟動”模塊里的 OpenStartup() 函數(shù),所以,只要把“啟動”模塊弄明白就行了。同啟動模塊配合的,是 Constants 模塊,這個模塊的用意是為了程序維護設(shè)置以及本地化的方便,同時也能使其他模塊看起來變得清晰一些。當(dāng)然,對中文用戶來說,想快速地理解“啟動”模塊,一個比較好的辦法竟然是把這些常量手工代到“啟動”模塊里,如此,理解程序反而會更快些,比如,“啟動”模塊中的
  1. Dim Response, Msg, Title, Style

  2. Msg = SelectPrompt1 + Chr$(10) + Chr$(13) + Chr$(10) + Chr$(13) + SelectPrompt2

  3. Style = vbOKCancel + vbInformation

  4. Title = SelectTitle

  5. Response = MsgBox(Msg, Style, Title)

  6. If Response <> vbCancel Then……….
復(fù)制代碼
這種方式寫的,如果改成
  1. If MsgBox("你要……嗎?", vbOKCancel+vbInformation, "請選擇")=vbOK then ………
復(fù)制代碼
這樣的形式,只要一行就夠,也許對初次看程序略有幫助。



現(xiàn)在來看“啟動”模塊,一共有




  • Function OpenStartup() As Boolean
  • Function CreateDB() As Boolean
  • Function RunScript(DBName As String, InFile As String) As Boolean
  • Function HideStartupForm()
  • Function CloseForm()
  • Function CheckConnectedServer()
  • Function DBInstallPrompt(Server As String) As Boolean
  • Public Function GetDevInfo(cm AS ADODB…………….) As Boolean
  • Public Function CheckForNorthwind(cn As ADODB.Connection) As Boolean
  • Public Function StartSQLServer() As Boolean
  • Public Sub ChangeDB(NewDBName As String)
  • Public Function IsNorthwindNew()





12 個函數(shù)或過程,F(xiàn)在,把一些同本文主題無關(guān)的或?qū)嶋H用處不大的先去掉,例如 HideStartupForm,CloseForm,GetDevInfo(這是為了獲得同 sql server 早先版本的兼容性),IsNorthwindNew(這是為了獲得同早先版本的 NorthwindCS 數(shù)據(jù)庫的兼容性,主要是雇員圖片的存儲方式變化),現(xiàn)在下面 8 個過程或函數(shù)是我們需要理解掌握的:



Function OpenStartup() As Boolean – 本文將要詳細(xì)解釋

Function

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖1 訂閱訂閱
2#
 樓主| 發(fā)表于 2005-1-28 23:38:00 | 只看該作者




[此貼子已經(jīng)被作者于2005-1-28 15:38:32編輯過]

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
3#
 樓主| 發(fā)表于 2005-1-28 23:40:00 | 只看該作者
下面來看 CheckConnectedServer (啟動 SQL server 的例程 StartSQLServer() 放到后面再說):

還是直接先看圖比較好。直觀。圖中,將間接調(diào)用的幾個函數(shù)也全部都寫進去了。





本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
4#
 樓主| 發(fā)表于 2005-1-28 23:41:00 | 只看該作者
還是先按我們自己的方式,將一些眼花繚亂的變量直接代進去,改寫函數(shù)成這個樣子:
  1. Function CheckConnectedServer()

  2. If (CurrentProject.Connection.Properties("Initial Catalog") = "NorthwindCS") Then

  3.         ''' 表明現(xiàn)在連接的正是NorthwindCS數(shù)據(jù)庫

  4.         Exit Sub

  5.     ElseIf CheckForNorthwind(CurrentProject.Connection) Then

  6.         Exit Sub

  7.     Else

  8.         ''' 數(shù)據(jù)庫服務(wù)器上沒有找到northwindCS,(連接已經(jīng)成功)

  9.         ''' 所以運行DBInstallPrompt問是否安裝一個

  10.         ''' 如果DBInstallPrompt返回true,表示數(shù)據(jù)庫安裝完畢,所以

  11.         ''' 用ChangeDB(“NorthwindCS”)來使連接切換到northwindCS

  12.         If (DBInstallPrompt(CurrentProject.Connection.Properties("Data Source"))) Then

  13.             MsgBox "在 SQL Server 上創(chuàng)建 NorthwindCS 數(shù)據(jù)庫: ", _

  14.                          vbOKOnly + vbInformation, "安裝成功"

  15.             ChangeDB ("NorthwindCS")

  16.         Else

  17.             ''' 如果安裝不成功,只要將連接設(shè)成空的,退出

  18.             CurrentProject.OpenConnection "Provider="

  19.         End If

  20.     End If

  21. End Function
復(fù)制代碼
以上程序,再結(jié)合圖,我想應(yīng)該是可以解釋清楚了。最需要掌握的基本概念就是SQL OLEDB的連接字符串,常用的是這樣的(用windows集成安全性)
  1. Provider=SQLOLEDB.1;Integrated Security=SSPI; Persist SecurityInfo=False;

  2. Initial Catalog=master ; Data Source=(local)
復(fù)制代碼
傳統(tǒng)安全性例如:
  1. Provider=sqloledb.1;Data Source=(local);Initial Catalog=master;User Id=xxx;Password=xxx;
復(fù)制代碼
(請去http://www.connectionstrings.com/ 看看。你一定需要它)



以上連接字符串,假定連接的是本機(local)和master數(shù)據(jù)庫。

CurrentProject.Connection.Properties("Initial Catalog")就是將Initial Catalog后的數(shù)據(jù)庫名取出來了,

CurrentProject.Connection.Properties("Data Source")就是取得服務(wù)器名。



CheckForNorthwind函數(shù)是用來看數(shù)據(jù)庫里有沒有NorthwindCS,如果有的話,就用ChangeDB("NorthwindCS")來切換到它。

注意Set rs = cn.Execute("select 1 from master..sysdatabases where name='NorthwindCS'")這個用法。



ChangeDB函數(shù)所做的事情,就是找到連接字符串中"Initial Catalog=master; "這個串的位置,然后把后面master改成NorthwindCS。注意到新的連接字符串ConnectStr弄好后,用 CurrentProject.OpenConnection ConnectStr 來更新當(dāng)前的連接。這是本函數(shù)的精華。



如果連接到了一個數(shù)據(jù)庫服務(wù)器,而又找不到NorthwindCS,那么,接下來就要提示用戶是否安裝northwindCS數(shù)據(jù)庫。這就是DBInstallPrompt的用處。

在DBInstallPrompt中,項目路徑下找NorthwindCS.sql文件就是
  1. Dir(CurrentProject.path + "\NorthwindCS.sql")
復(fù)制代碼
如果找不到的話,就退出。而在新的office中,我們可以把這個功能稍微再拓展一下,添加對Microsoft Office 11.0 Object Library的引用,就可以輕松地用FileDialog對象來打開文件對話框了,我在后面自己的例子中將實現(xiàn)這一點。找到后就是具體的將NorthwindCS數(shù)據(jù)庫和對象、數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫的時候了:
  1. Screen.MousePointer = 11

  2.     If CreateDB() Then

  3.         If RunScript("NorthwindCS", Script) Then

  4.            DBInstallPrompt = True

  5.         End If

  6.     End If

  7. Screen.MousePointer = 0[code]



  8. 編程的新手,要特別注意這種編程的風(fēng)格,就是將某個功能編寫成返回類型為布爾值的函數(shù),然后在調(diào)用判斷的過程就已經(jīng)執(zhí)行了這個函數(shù)。例如CreatDB和RunScript都是返回布爾值的函數(shù),在函數(shù)內(nèi)部,定義了如果執(zhí)行成功就返回true,否則就返回false。所以,If CreatDB()的條件成立也就是CreatDB()返回true。這是常用的編程方法。



  9. CreatDB()函數(shù)就是在上述連接中執(zhí)行SQL服務(wù)器端命令:

  10. [code]use master

  11. go

  12. create database NorthwindCS

  13. go

  14. exec sp_dboption 'NorthwindCS','trunc. Log on chkpt.','true'

  15. go

  16. exec sp_dboption 'NorthwindCS’,’trunc. Log on chkpt.','true'

  17. go
復(fù)制代碼
最后兩句是告訴master數(shù)據(jù)庫將NorthwindCS日志截斷,又可提高數(shù)據(jù)倒入時的效率。至于為什么要走兩遍,這個我并不知道。知道的同學(xué)請告訴我一下。



RunScript() 就是運行同一個目錄下的 northwindCS.sql 腳本了。這里值得注意的地方就是:一個雙引號字符是用雙引號括起來的兩個雙引號(繞口令一樣) - 單引號也如此。
  1. Q$ = """"
復(fù)制代碼
-----上面繞口令就是這個意思 或Q$=Chr(34) 事實上代表一個[雙引號字符]。
  1. cm.CommandText = "use " + Q$ + DBName + Q$
復(fù)制代碼
我們最后的要求是要把use “NorthwindCS”傳遞到SQL服務(wù)器中。說實話,現(xiàn)在新版本的SQLServer直接
5#
 樓主| 發(fā)表于 2005-1-28 23:43:00 | 只看該作者
下面,我用一些圖片來說明一下如何手工將一個數(shù)據(jù)庫服務(wù)器里的northwind數(shù)據(jù)庫的所有對象用備份還原方法轉(zhuǎn)移到另外一個服務(wù)器的test數(shù)據(jù)庫里。(在接下來我們自己的例子中,我將用編程實現(xiàn)這一方法)





第一步,當(dāng)然,現(xiàn)建立一個northwind數(shù)據(jù)庫的備份,假定這個備份的名稱是northwind.backup。比較簡單,就不用圖片了。

第二步,將northwind.backup備份恢復(fù)到另外一個數(shù)據(jù)庫服務(wù)器的test數(shù)據(jù)庫中,F(xiàn)將這個備份文件拷貝到目標(biāo)機器中,位置隨意,比如C:\northwind.backup,然后,在目標(biāo)機器中新建一個空數(shù)據(jù)庫,名稱為test。這一步也很簡單,不用圖片說明。

第三步,在test上點右鍵,“所有任務(wù)”,“還原數(shù)據(jù)庫”,然后選擇還原“從設(shè)備”,而不是“數(shù)據(jù)庫”或者“文件組或文件”。然后選擇設(shè)備,添加,選擇C:\northwind.backup,確定后回到如下圖所示界面:







第四步,到“選項”卡,如下圖,將“移至物理文件名”下面的兩個文件都改成test.ldf, test.mdf,就可以了。





[此貼子已經(jīng)被作者于2005-2-1 19:59:29編輯過]

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
6#
 樓主| 發(fā)表于 2005-1-28 23:47:00 | 只看該作者
現(xiàn)在,我們用剛剛學(xué)到的知識,來做一個數(shù)據(jù)庫登錄和安裝的框架程序。

程序的目的:在windows集成登錄和SQL Server傳統(tǒng)登錄的兩種條件下,讓最終用戶能夠按照提示建立一個新的數(shù)據(jù)庫,并用備份還原和運行SQL腳本文件的兩種方法完成數(shù)據(jù)庫的安裝。完成安裝以后,該用戶(假定該用戶是單位的系統(tǒng)管理員)可以直接分發(fā)給本單位的實際使用者,而這些實際使用者并不需要任何設(shè)定就可以使用程序。程序的目的是將安裝設(shè)置步驟簡單化。

從NorthwindCS.ADP的實用意義來看,整體構(gòu)思的用處并不大。如果為某個機構(gòu)開發(fā)一個ADP項目,那么一個比較符合實際的部署模式就是把做完的程序和庫拿過去,假如那邊已經(jīng)設(shè)置好了服務(wù)器和網(wǎng)絡(luò),那么需要做的事情就是設(shè)置到服務(wù)器的連接,然后將數(shù)據(jù)庫拷貝過去。最后只要分發(fā)設(shè)置好的ADE程序給用戶就可以了。只要用戶對SQL server稍有了解,就能輕松部署,如果用戶對SQL Server完全不了解,那么反正你人是要跑過去的,用這個程序框架,可以使自己的部署任務(wù)變得輕松一些。如果想做一個大而全的東西,又要考慮本地、遠(yuǎn)程服務(wù)器,又要考慮實例名,又要考慮是不是已經(jīng)啟動,這樣反而難做。

下載在這里:












世界上為什么有Powered By :Dvbbs Version 7.0.0 Sp2這么可恨的東西?





[此貼子已經(jīng)被作者于2005-1-28 20:08:38編輯過]

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
7#
 樓主| 發(fā)表于 2005-1-29 00:03:00 | 只看該作者
演示程序的一些說明:

為了方便各位同學(xué)拿去研究,程序打開時的數(shù)據(jù)庫窗口、工具欄等一應(yīng)俱全。可以在執(zhí)行當(dāng)中打開設(shè)計視圖修改設(shè)置。

涉及到一些引用,由于版本問題,很多人可能運行不了本程序。不必抱怨,程序代碼在那里擺著,自己研究解決。本程序?qū)崿F(xiàn)的平臺是WindowsXP SP2, Office 2003, SQL Server Developer Edition SP3。引用情況如圖



為了用兩種模式試驗本程序,你要準(zhǔn)備一個數(shù)據(jù)庫備份和一個SQL腳本文件。如果要把數(shù)據(jù)庫裝到遠(yuǎn)程機器上,那么要注意數(shù)據(jù)庫備份和數(shù)據(jù)庫安裝位置的路徑是服務(wù)器那邊的,不是執(zhí)行adp這兒的路徑。

[此貼子已經(jīng)被作者于2005-1-28 16:31:12編輯過]

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
8#
 樓主| 發(fā)表于 2005-1-29 00:41:00 | 只看該作者
如果服務(wù)器是遠(yuǎn)程的,那么備份文件要拷貝到服務(wù)器中,例如下面這里例子,文件時在E:\下面,安裝以后的數(shù)據(jù)庫,也放在E:\下面,E:\是遠(yuǎn)程服務(wù)器的,不是本地的。





[此貼子已經(jīng)被作者于2005-1-28 16:42:03編輯過]

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
9#
 樓主| 發(fā)表于 2005-1-29 00:48:00 | 只看該作者
如果要使用這個程序作為框架,可以先調(diào)整一下settings模塊

將promptConn設(shè)為false,然后看一下窗體那里,現(xiàn)在有三個窗體,setup, start1,start2,其中setup窗體是第一次運行時安裝數(shù)據(jù)庫用的,安裝完了以后,按照windows集成登錄或用戶密碼登錄不同,下次啟動就是start1或者start2。

Public Const promptConn = True '設(shè)計時為false,分發(fā)前改為true

'=====================================================================

'為了不使用戶在選擇上發(fā)生麻煩,在程序設(shè)計的時候就要決定用何種方法分發(fā)

'所以定義了一個枚舉常量,adpBackup表示用備份還原方式安裝數(shù)據(jù)庫

'adpScript表示用.sql腳本方式安裝數(shù)據(jù)庫

'當(dāng)然,你可以不用這么做,從而給用戶和自己最大的靈活性


Public Enum DBInstMode

    adpBackup = 0

    adpScript = 1

End Enum

'======================================================

'現(xiàn)在我們用備份還原方式安裝數(shù)據(jù)庫


Public Const defaultDBInstMethod = DBInstMode.adpBackup

'Public Const defaultDBInstMethod = DBInstMode.adpScript

'======================================================

'這里我們把要分發(fā)給用戶的備份文件名和擴展名先行命名


Public Const defaultDBName = "NorthwindCS"

Public Const DBBackupFile = ".inst"

Public Const DBSQLFile = ".sql"

'======================================================

'======================================================

'如果用戶是用windows集成安全性登錄,那么程序啟動后,數(shù)

'據(jù)庫那里應(yīng)該有該windows用戶及其適當(dāng)權(quán)限,所以連接以后

'馬上可以得到用戶的數(shù)據(jù)庫(也就是windows用戶)的名稱,

'這個名稱如果不在數(shù)據(jù)庫的用戶表里,那么就立即應(yīng)該實施

'一個插入動作,之前可以讓用戶將實際姓名改為他自己的。

'用戶表里應(yīng)該包含logName, realName這兩個字段,密碼是不

'需要的。

'如果用戶是用傳統(tǒng)方式登錄的,那么有可能系統(tǒng)管理員為了

'數(shù)據(jù)庫服務(wù)器管理上的方便,用一個統(tǒng)一的登錄名和密碼進行

'登錄,如果分發(fā)的程序是ADE,那么即使保留了密碼,用戶

'還是不能輕易通過讀取連接字符串來得到這個密碼。

'例如debug.print currentProject.baseConnectionString

'所以,一般而言還是安全的。

'而在這種情況下,要區(qū)分不同的用戶

'只能自己編程,通過一個窗體提示用戶輸入用戶名和密碼。

'=====================================================


'由于兩種登錄方法的不同程序邏輯,有必要設(shè)計兩個不同的

'窗體,區(qū)分用戶在兩種登錄模式下的啟動窗體。

'=====================================================


Public Const integratedLoginStartupForm = "start1"

Public Const legacyLoginStartupForm = "start2"

Public Const setupForm = "setup"

[此貼子已經(jīng)被作者于2005-1-28 17:23:14編輯過]

10#
 樓主| 發(fā)表于 2005-1-29 00:55:00 | 只看該作者
設(shè)計時運行情況

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 06:18 , Processed in 0.117117 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表