设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12345下一页
返回列表 发新帖
查看: 25666|回复: 47
打印 上一主题 下一主题

NorthwindCS启动解读及高级应用示例

[复制链接]
跳转到指定楼层
1#
发表于 2005-1-28 23:37:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
阿罗 2005年1月27日



初次接触 ADP,往往被建议从解读 NorthwindCS 入手。确实,这是个很好的范例。然而,由于很多同学是从自学 Access-mdb 开始入门的,刚刚开始 ADP 之旅,看到 NorthwindSC 这么复杂的一个启动局面,根本就搞不懂这是怎么回事;另外,不排除一些老鸟,虽然可以做一些 ADP 的东西,但是往往局限于手工部署,虽然解读 NorthwindCS 可以有所提高,由于注释都是英文,而且定义的常量变量一大堆,看着都觉得累,这样就失去了进一步提高的机会,很是可惜。本文希望通过对 NorthwindCS 启动模块的分析,让读者深入体会 ADP 向 SQL Server 连接的设置和数据库自动化安装的机理,并且想通过一个作者自己编制的程序来进一步说明如何灵活运用这些刚刚学到的概念。希望同学们通过这篇短文,能举一反三地写出自己的、更好的 ADP 应用程序。





以 Office 2003 为例(下同),NorthwindCS.adp 一般在 C:/program files/Microsoft office/office11/samples/ 目录中,还应该看到一个 northwindCS.sql 数据库脚本文件。对于如何设置启动窗体和切换到另一个启动窗体,就不说了,如果连这个都没办法搞明白,那么就不要把时间浪费在这篇文章上了。



现在直接进入正题,“启动”窗体启动时,调用的是“启动”模块里的 OpenStartup() 函数,所以,只要把“启动”模块弄明白就行了。同启动模块配合的,是 Constants 模块,这个模块的用意是为了程序维护设置以及本地化的方便,同时也能使其他模块看起来变得清晰一些。当然,对中文用户来说,想快速地理解“启动”模块,一个比较好的办法竟然是把这些常量手工代到“启动”模块里,如此,理解程序反而会更快些,比如,“启动”模块中的
  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……….
复制代码
这种方式写的,如果改成
  1. If MsgBox("你要……吗?", vbOKCancel+vbInformation, "请选择")=vbOK then ………
复制代码
这样的形式,只要一行就够,也许对初次看程序略有帮助。



现在来看“启动”模块,一共有




  • 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 个函数或过程。现在,把一些同本文主题无关的或实际用处不大的先去掉,例如 HideStartupForm,CloseForm,GetDevInfo(这是为了获得同 sql server 早先版本的兼容性),IsNorthwindNew(这是为了获得同早先版本的 NorthwindCS 数据库的兼容性,主要是雇员图片的存储方式变化),现在下面 8 个过程或函数是我们需要理解掌握的:



Function OpenStartup() As Boolean – 本文将要详细解释

Function

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖1 订阅订阅
2#
 楼主| 发表于 2005-1-28 23:38:00 | 只看该作者




[此贴子已经被作者于2005-1-28 15:38:32编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
3#
 楼主| 发表于 2005-1-28 23:40:00 | 只看该作者
下面来看 CheckConnectedServer (启动 SQL server 的例程 StartSQLServer() 放到后面再说):

还是直接先看图比较好。直观。图中,将间接调用的几个函数也全部都写进去了。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
4#
 楼主| 发表于 2005-1-28 23:41:00 | 只看该作者
还是先按我们自己的方式,将一些眼花缭乱的变量直接代进去,改写函数成这个样子:
  1. Function CheckConnectedServer()

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

  3.         ''' 表明现在连接的正是NorthwindCS数据库

  4.         Exit Sub

  5.     ElseIf CheckForNorthwind(CurrentProject.Connection) Then

  6.         Exit Sub

  7.     Else

  8.         ''' 数据库服务器上没有找到northwindCS,(连接已经成功)

  9.         ''' 所以运行DBInstallPrompt问是否安装一个

  10.         ''' 如果DBInstallPrompt返回true,表示数据库安装完毕,所以

  11.         ''' 用ChangeDB(“NorthwindCS”)来使连接切换到northwindCS

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

  13.             MsgBox "在 SQL Server 上创建 NorthwindCS 数据库: ", _

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

  15.             ChangeDB ("NorthwindCS")

  16.         Else

  17.             ''' 如果安装不成功,只要将连接设成空的,退出

  18.             CurrentProject.OpenConnection "Provider="

  19.         End If

  20.     End If

  21. End Function
复制代码
以上程序,再结合图,我想应该是可以解释清楚了。最需要掌握的基本概念就是SQL OLEDB的连接字符串,常用的是这样的(用windows集成安全性)
  1. Provider=SQLOLEDB.1;Integrated Security=SSPI; Persist SecurityInfo=False;

  2. Initial Catalog=master ; Data Source=(local)
复制代码
传统安全性例如:
  1. Provider=sqloledb.1;Data Source=(local);Initial Catalog=master;User Id=xxx;Password=xxx;
复制代码
(请去http://www.connectionstrings.com/ 看看。你一定需要它)



以上连接字符串,假定连接的是本机(local)和master数据库。

CurrentProject.Connection.Properties("Initial Catalog")就是将Initial Catalog后的数据库名取出来了,

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



CheckForNorthwind函数是用来看数据库里有没有NorthwindCS,如果有的话,就用ChangeDB("NorthwindCS")来切换到它。

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



ChangeDB函数所做的事情,就是找到连接字符串中"Initial Catalog=master; "这个串的位置,然后把后面master改成NorthwindCS。注意到新的连接字符串ConnectStr弄好后,用 CurrentProject.OpenConnection ConnectStr 来更新当前的连接。这是本函数的精华。



如果连接到了一个数据库服务器,而又找不到NorthwindCS,那么,接下来就要提示用户是否安装northwindCS数据库。这就是DBInstallPrompt的用处。

在DBInstallPrompt中,项目路径下找NorthwindCS.sql文件就是
  1. Dir(CurrentProject.path + "\NorthwindCS.sql")
复制代码
如果找不到的话,就退出。而在新的office中,我们可以把这个功能稍微再拓展一下,添加对Microsoft Office 11.0 Object Library的引用,就可以轻松地用FileDialog对象来打开文件对话框了,我在后面自己的例子中将实现这一点。找到后就是具体的将NorthwindCS数据库和对象、数据导入数据库的时候了:
  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. 编程的新手,要特别注意这种编程的风格,就是将某个功能编写成返回类型为布尔值的函数,然后在调用判断的过程就已经执行了这个函数。例如CreatDB和RunScript都是返回布尔值的函数,在函数内部,定义了如果执行成功就返回true,否则就返回false。所以,If CreatDB()的条件成立也就是CreatDB()返回true。这是常用的编程方法。



  9. CreatDB()函数就是在上述连接中执行SQL服务器端命令:

  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
复制代码
最后两句是告诉master数据库将NorthwindCS日志截断,又可提高数据倒入时的效率。至于为什么要走两遍,这个我并不知道。知道的同学请告诉我一下。



RunScript() 就是运行同一个目录下的 northwindCS.sql 脚本了。这里值得注意的地方就是:一个双引号字符是用双引号括起来的两个双引号(绕口令一样) - 单引号也如此。
  1. Q$ = """"
复制代码
-----上面绕口令就是这个意思 或Q$=Chr(34) 事实上代表一个[双引号字符]。
  1. cm.CommandText = "use " + Q$ + DBName + Q$
复制代码
我们最后的要求是要把use “NorthwindCS”传递到SQL服务器中。说实话,现在新版本的SQLServer直接
5#
 楼主| 发表于 2005-1-28 23:43:00 | 只看该作者
下面,我用一些图片来说明一下如何手工将一个数据库服务器里的northwind数据库的所有对象用备份还原方法转移到另外一个服务器的test数据库里。(在接下来我们自己的例子中,我将用编程实现这一方法)





第一步,当然,现建立一个northwind数据库的备份,假定这个备份的名称是northwind.backup。比较简单,就不用图片了。

第二步,将northwind.backup备份恢复到另外一个数据库服务器的test数据库中。现将这个备份文件拷贝到目标机器中,位置随意,比如C:\northwind.backup,然后,在目标机器中新建一个空数据库,名称为test。这一步也很简单,不用图片说明。

第三步,在test上点右键,“所有任务”,“还原数据库”,然后选择还原“从设备”,而不是“数据库”或者“文件组或文件”。然后选择设备,添加,选择C:\northwind.backup,确定后回到如下图所示界面:







第四步,到“选项”卡,如下图,将“移至物理文件名”下面的两个文件都改成test.ldf, test.mdf,就可以了。





[此贴子已经被作者于2005-2-1 19:59:29编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
6#
 楼主| 发表于 2005-1-28 23:47:00 | 只看该作者
现在,我们用刚刚学到的知识,来做一个数据库登录和安装的框架程序。

程序的目的:在windows集成登录和SQL Server传统登录的两种条件下,让最终用户能够按照提示建立一个新的数据库,并用备份还原和运行SQL脚本文件的两种方法完成数据库的安装。完成安装以后,该用户(假定该用户是单位的系统管理员)可以直接分发给本单位的实际使用者,而这些实际使用者并不需要任何设定就可以使用程序。程序的目的是将安装设置步骤简单化。

从NorthwindCS.ADP的实用意义来看,整体构思的用处并不大。如果为某个机构开发一个ADP项目,那么一个比较符合实际的部署模式就是把做完的程序和库拿过去,假如那边已经设置好了服务器和网络,那么需要做的事情就是设置到服务器的连接,然后将数据库拷贝过去。最后只要分发设置好的ADE程序给用户就可以了。只要用户对SQL server稍有了解,就能轻松部署,如果用户对SQL Server完全不了解,那么反正你人是要跑过去的,用这个程序框架,可以使自己的部署任务变得轻松一些。如果想做一个大而全的东西,又要考虑本地、远程服务器,又要考虑实例名,又要考虑是不是已经启动,这样反而难做。

下载在这里:












世界上为什么有Powered By :Dvbbs Version 7.0.0 Sp2这么可恨的东西?





[此贴子已经被作者于2005-1-28 20:08:38编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
7#
 楼主| 发表于 2005-1-29 00:03:00 | 只看该作者
演示程序的一些说明:

为了方便各位同学拿去研究,程序打开时的数据库窗口、工具栏等一应俱全。可以在执行当中打开设计视图修改设置。

涉及到一些引用,由于版本问题,很多人可能运行不了本程序。不必抱怨,程序代码在那里摆着,自己研究解决。本程序实现的平台是WindowsXP SP2, Office 2003, SQL Server Developer Edition SP3。引用情况如图



为了用两种模式试验本程序,你要准备一个数据库备份和一个SQL脚本文件。如果要把数据库装到远程机器上,那么要注意数据库备份和数据库安装位置的路径是服务器那边的,不是执行adp这儿的路径。

[此贴子已经被作者于2005-1-28 16:31:12编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
8#
 楼主| 发表于 2005-1-29 00:41:00 | 只看该作者
如果服务器是远程的,那么备份文件要拷贝到服务器中,例如下面这里例子,文件时在E:\下面,安装以后的数据库,也放在E:\下面,E:\是远程服务器的,不是本地的。





[此贴子已经被作者于2005-1-28 16:42:03编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
9#
 楼主| 发表于 2005-1-29 00:48:00 | 只看该作者
如果要使用这个程序作为框架,可以先调整一下settings模块

将promptConn设为false,然后看一下窗体那里,现在有三个窗体,setup, start1,start2,其中setup窗体是第一次运行时安装数据库用的,安装完了以后,按照windows集成登录或用户密码登录不同,下次启动就是start1或者start2。

Public Const promptConn = True '设计时为false,分发前改为true

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

'为了不使用户在选择上发生麻烦,在程序设计的时候就要决定用何种方法分发

'所以定义了一个枚举常量,adpBackup表示用备份还原方式安装数据库

'adpScript表示用.sql脚本方式安装数据库

'当然,你可以不用这么做,从而给用户和自己最大的灵活性


Public Enum DBInstMode

    adpBackup = 0

    adpScript = 1

End Enum

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

'现在我们用备份还原方式安装数据库


Public Const defaultDBInstMethod = DBInstMode.adpBackup

'Public Const defaultDBInstMethod = DBInstMode.adpScript

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

'这里我们把要分发给用户的备份文件名和扩展名先行命名


Public Const defaultDBName = "NorthwindCS"

Public Const DBBackupFile = ".inst"

Public Const DBSQLFile = ".sql"

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

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

'如果用户是用windows集成安全性登录,那么程序启动后,数

'据库那里应该有该windows用户及其适当权限,所以连接以后

'马上可以得到用户的数据库(也就是windows用户)的名称,

'这个名称如果不在数据库的用户表里,那么就立即应该实施

'一个插入动作,之前可以让用户将实际姓名改为他自己的。

'用户表里应该包含logName, realName这两个字段,密码是不

'需要的。

'如果用户是用传统方式登录的,那么有可能系统管理员为了

'数据库服务器管理上的方便,用一个统一的登录名和密码进行

'登录,如果分发的程序是ADE,那么即使保留了密码,用户

'还是不能轻易通过读取连接字符串来得到这个密码。

'例如debug.print currentProject.baseConnectionString

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

'而在这种情况下,要区分不同的用户

'只能自己编程,通过一个窗体提示用户输入用户名和密码。

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


'由于两种登录方法的不同程序逻辑,有必要设计两个不同的

'窗体,区分用户在两种登录模式下的启动窗体。

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


Public Const integratedLoginStartupForm = "start1"

Public Const legacyLoginStartupForm = "start2"

Public Const setupForm = "setup"

[此贴子已经被作者于2005-1-28 17:23:14编辑过]

10#
 楼主| 发表于 2005-1-29 00:55:00 | 只看该作者
设计时运行情况

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-12-1 19:48 , Processed in 0.101421 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表