Office中国论坛/Access中国论坛

标题: NorthwindCS启动解读及高级应用示例 [打印本页]

作者: 阿罗    时间: 2005-1-28 23:37
标题: NorthwindCS启动解读及高级应用示例
阿罗 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 ………
复制代码
这样的形式,只要一行就够,也许对初次看程序略有帮助。



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







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



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

Function
作者: 阿罗    时间: 2005-1-28 23:38
[attach]8834[/attach]



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


作者: 阿罗    时间: 2005-1-28 23:40
下面来看 CheckConnectedServer (启动 SQL server 的例程 StartSQLServer() 放到后面再说):

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



[attach]8835[/attach]


作者: 阿罗    时间: 2005-1-28 23:41
还是先按我们自己的方式,将一些眼花缭乱的变量直接代进去,改写函数成这个样子:
  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直接
作者: 阿罗    时间: 2005-1-28 23:43
下面,我用一些图片来说明一下如何手工将一个数据库服务器里的northwind数据库的所有对象用备份还原方法转移到另外一个服务器的test数据库里。(在接下来我们自己的例子中,我将用编程实现这一方法)





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

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

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



[attach]8836[/attach]



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

[attach]8837[/attach]



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


作者: 阿罗    时间: 2005-1-28 23:47
现在,我们用刚刚学到的知识,来做一个数据库登录和安装的框架程序。

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

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

下载在这里:

[attach]8846[/attach]










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





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


作者: 阿罗    时间: 2005-1-29 00:03
演示程序的一些说明:

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

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

[attach]8839[/attach]

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

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


作者: 阿罗    时间: 2005-1-29 00:41
如果服务器是远程的,那么备份文件要拷贝到服务器中,例如下面这里例子,文件时在E:\下面,安装以后的数据库,也放在E:\下面,E:\是远程服务器的,不是本地的。

[attach]8840[/attach][attach]8841[/attach]



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


作者: 阿罗    时间: 2005-1-29 00:48
如果要使用这个程序作为框架,可以先调整一下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编辑过]


作者: 阿罗    时间: 2005-1-29 00:55
设计时运行情况[attach]8842[/attach]


作者: 阿罗    时间: 2005-1-29 01:00
setup窗体全部代码(一)

<DIV class=quote>

Option Compare Database

Option Explicit

Dim startFormName  As String

Dim localSrv, legacyLogin, installOK As Boolean

Private Sub remoteAlert(moreMsg As String)

Dim remoteAlert As String

remoteAlert = "如果SQL服务器没有安装在这台电脑上,那   " & vbNewLine & _

            "么""数据库路径""指的是服务器电脑路径,例 " & vbNewLine & _

            "如路径是C:\,意即服务器的C盘,而不是这   " & vbNewLine & _

            "台电脑的C盘。" & vbNewLine & _

            "必须按此方式指定路径而不能用网络位置代替。"

MsgBox remoteAlert & vbNewLine & vbNewLine & moreMsg, vbInformation + vbOKOnly, "重要提示"

End Sub

Private Sub addLog(action As String, message As String)

txtInfo = txtInfo & ">" & action & " (" & CStr(Now) & ") " & message & vbNewLine

End Sub

Private Sub btnCheckDBName_Click()

'只是检查数据库名称,并不进行任何实际操作

If Not CurrentProject.IsConnected Then

    If MsgBox("数据连接不存在,请重新选择连接", vbOKCancel + vbExclamation, "没有连接") = vbOK Then

        DoCmd.RunCommand acCmdConnection

        Call addLog("检查数据库名称", "到数据库的连接不存在,重新选择连接。")

    End If

Else

    If CheckDBName(Me.txtDBName) Then

        MsgBox "数据库名称检查通过,可以创建", vbInformation + vbOKOnly, ""

        Call addLog("检查数据库名称", "名称检查通过")

    Else

        MsgBox "服务器上有相同名称的数据库", vbExclamation + vbOKOnly, ""

        Call addLog("检查数据库名称", "数据库中有同名数据库")

    End If

End If

End Sub

Private Sub btnConn_Click()

    DoCmd.RunCommand acCmdConnection

End Sub

Private Sub btnDBInst_Click()

On Error GoTo DBInst_err

If Not CurrentProject.IsConnected Then

    If MsgBox("数据连接不存在,请重新选择连接", vbOKCancel + vbExclamation, "没有连接") = vbOK Then

        DoCmd.RunCommand acCmdConnection

        Call addLog("安装数据库", "到数据库的连接不存在,需要重新选择连接。")

    End If

Else

    If Not CheckDBName(Me.txtDBName) Then

        If MsgBox("服务器上有相同名称的数据库,继续吗?" & vbNewLine & vbNewLine & _

            "如果继续,该数据库内容将被覆盖", vbExclamation + vbYesNo + vbDefaultButton2, "提示") = vbNo Then

            Call addLog("安装数据库", "数据库中有同名数据库,用户取消安装")

            Exit Sub

        Else

            If dropDB(Me.txtDBName) Then

                Call addLog("安装数据库", "服务器中原同名数据库已脱开" & Me.txtDBName)

            End If

        End If

    End If

    If installDB(defaultDBInstMethod, Me.txtFilePath) Then

        MsgBox "数据库已成功安装。现在您可以退出," & vbNewLine & "本程序可以拷贝给网内用户使用", vbOKOnly + vbInformation, ""

        Call addLog("安装数据库", Me.txtDBName & "安装成功")

        ChangeDB (txtDBName)

        '通过是否有UserID这个属性来判定是传统登录还是Windows登录

        '呵呵,如果有个用户名是“没有定义”那就惨了。

        '不要用currentProject.Connection.Properties ("User Id"),虽然实际使用是区别不大,但在测试的时候,从

        '一个登录模式切换到另一个,这个properties集合里面的东西不一定会消失。

        legacyLogin = (parseConnStr(CurrentProject.BaseConnectionString, "User Id") <> "没有定义")

        If legacyLogin Then

            startFormName = legacyLoginStartupForm

        Else

            startFormName = integratedLoginStartupForm

        End If

        CurrentProject.Properties("StartupForm") = startFormName

        Me.Command52.SetFocus

        btnDBInst.Enabled = False

    Else

        MsgBox "数据库安装失败", vbCritical + vbOKOnly, "出错"

        Call addLog("安装数据库", Me.txtDBName & "安装失败")

    End If

End If

Exit Sub

DBInst_err:

    Const conPropertyNotFound = 2473

    If Err = conPropertyNotFound Then

        CurrentProject.Properties.Add "StartupForm", startFormName

        Resume Next

    Else

        MsgBox Err.Number & Err.Description, vbCritical + vbOKOnly, "出错"

        CurrentProject.Properties("StartupForm") = setup
作者: 阿罗    时间: 2005-1-29 01:01
setup窗体全部代码 (二)

<DIV class=quote>

Private Function installDBbackup(DBFile As String, DBName As String, DBPhysicalName As String, DBLogName As String, DBPhysicalPath As String) As Boolean

'这个演示,对于本机的MSDE很有用

'如果是远程,则本机路径根本无用,因此必须要先将备份拷贝到服务器上去

'演示程序的特点就是可以将数据库备份文件还原为任意名称和任意位置

'这是Access中缺少的功能

'如果仅用于本地情形,则可对本程序稍做改动,并不需要提示用户将备份文件拷贝到远程服务器中

On Error GoTo err_handler

Dim oRestore As SQLDMO.Restore2, oServer As SQLDMO.SQLServer

Dim logicalName1, logicalName2 As String

Set oRestore = New SQLDMO.Restore2

Set oServer = New SQLDMO.SQLServer

oServer.Name = CurrentProject.Connection.Properties("Data Source")

'为了偷懒,下面用sql服务器的集成安全性登陆,如果用户密码登陆,则用oServer.connect servername, userid,passwd这个格式,去掉oServer.loginSecure这行。

'详细情况可查sql-dmo文档

oServer.LoginSecure = True

oServer.Connect

'这里,先分析路径的有效性

With oRestore

    .action = SQLDMORestore_Database

    .Database = DBName

    .Files = "[" & DBFile & "]" '定界符是必须的

    .FileNumber = 1

    .ReplaceDatabase = True

'    下列程序演示了如何取得读入的备份文件属性

'    Dim i As Integer

'    For i = 1 To .ReadFileList(oServer).Rows

'        Debug.Print .ReadFileList(oServer).GetColumnString(i, 1)

'    Next i     '仿此也可将所有column读出

'    程序输出结果类似于:

'    testDB

'    testDB_log

    logicalName1 = .ReadFileList(oServer).GetColumnString(1, 1)

    logicalName2 = .ReadFileList(oServer).GetColumnString(2, 1)

    .RelocateFiles = "[" & logicalName1 & "],[" & DBPhysicalPath & "\" & DBPhysicalName & "],[" & logicalName2 & "],[" & DBPhysicalPath & "\" & DBLogName & "]"

    .SQLRestore oServer

End With

installDBbackup = True

'比较理想的,当然是再加入备份的验证,此地省略了

finally:

Set oRestore = Nothing

Set oServer = Nothing

Exit Function

err_handler:

    MsgBox Err.Description, vbCritical + vbOKOnly, ""

    installDBbackup = False

    Resume finally

End Function

Private Function installDBScript(DBFile As String, DBName As String) As Boolean

'从Microsof Access NorthwindCS修改而来

On Error GoTo err_handler

    Dim cn As New ADODB.Connection, cm As New ADODB.Command

    Dim infileopen As Boolean

    Dim incmd$, batch$, Q$

   

    installDBScript = False

   

    Q$ = """"  'quoted id char

   

    'Open up a new connection direct to SQL Server

    cn.ConnectionString = CurrentProject.BaseConnectionString

    cn.Open

   

    cm.ActiveConnection = cn

    cm.CommandType = adCmdText

   

    cm.CommandText = "use " + Q$ + DBName + Q$

    cm.Execute

   

    Open DBFile For Input As #1

    infileopen = True

    '将use一行去掉,因为我们要按照自己的意愿确定数据库名称,否则是要犯大错误滴

    '如果项目涉及到两个以上数据库,那么本演示是不适用的

    Do While Not EOF(1)

        Line Input #1, incmd$

        If (Left(incmd$, 3) <> "use") Then

            If (Left(incmd$, 2) <> "go") Then

                batch$ = batch$ + " " + incmd$

            Else

                If batch$ <> "" Then

                    cm.CommandText = batch$

                    cm.Execute

                    batch$ = ""

                End If

            End If

        End If

    Loop

      

    Close #1

    installDBScript = True

    cn.Close

Exit Function

err_handler:

    MsgBox Err.Description, vbCritical + vbOKOnly, ""

    If infileopen Then

        Close #1

    End If

    installDBScript = False

    cn.Close

End Function

Function CreateDB(NewDBName As String, DBPhysicalName As String, DBLogName As String, DBPhysicalPath As String) As Boolean

'从Microsof Access NorthwindCS修改而来

On Error GoTo CreateDB_Err

    Dim cn As New ADODB.Connection, cm As New ADODB.Command

    'Open up a new connection direct to SQL Server (not through MSDataShape)

    cn.ConnectionString = CurrentProject.BaseConnectionString

    cn.Open

      

    cm.Active
作者: 阿罗    时间: 2005-1-29 01:08
阿罗希望,通过本文,能使初学者对ADP的连接方面有个比较全面的认识,能够自如地运用到自己的编程实践当中去,写出更好更方便的应用来。[em05]
作者: 阿罗    时间: 2005-1-29 01:43
ADP中可以用代码实现更广泛的数据连接,方法是使用MDAC的连接设置功能,需要添加Microsoft OLE DB Service Component 1.0 Type Library[attach]8843[/attach]


作者: 阿罗    时间: 2005-1-29 01:48
添加该引用后,工程中就可以用MSDASC对象库来编程了。一个例子

public function PromptConnection() As Boolean

Dim oLink As Object

Set oLink = new MSDASC.DataLinks

oLink.PromptNew

set OLink=nothing

end function

运行情况如下:(注意早先版本的对象不是DataLinks,似乎是udl什么的,具体可以在代码窗口用F2查看引用库的对象和用法。)[attach]8845[/attach]



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


作者: 李寻欢    时间: 2005-1-29 04:57
顶,阿罗辛苦了.
作者: zhuyiwen    时间: 2005-1-29 05:19
真的不错, 辛苦了,阿罗!这是看到的关于ADP方面解剖和应用最全面的文章!可以评为本年最佳文章![em25]
作者: 阿罗    时间: 2005-1-29 05:25
多谢两位兄弟的支持和鼓励!
作者: 西西弗斯    时间: 2005-1-30 06:39
高手阿罗,文章有条理,思路清晰,结构严谨。谢谢。能把它做在一个文档里供大家下载学习呢?
作者: zhengjialon    时间: 2005-2-5 21:48
不错的文章!!
作者: msf    时间: 2005-3-3 05:51
对你的无私奉献致以崇高敬意!
作者: 宿命的风    时间: 2005-5-18 08:10
先收藏起来,然后认真理解!谢谢!
作者: lzx-shmily    时间: 2005-5-21 18:02
真的很不錯,如果能把它作在一個文檔里供大家下載那就更好了!
作者: secowu    时间: 2005-7-30 20:58
以下是引用msf在2005-3-2 21:51:00的发言:



对你的无私奉献致以崇高敬意!



感谢阿罗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 1231588    时间: 2005-9-14 06:32
不错不错
作者: yuzhusisi    时间: 2005-10-20 19:57
我在SQL建立了一张表,字段为公司名,日期,金额等希望把公司名设置成主键,但是系统提示不允许记录重复,

但是我看了北风数据northwind中的有一张订单明细表中,以订单ID为主键,但是我看到订单ID中的记录是有重复的,是怎么一回事呀[em10]

[此贴子已经被作者于2005-10-20 13:22:24编辑过]


作者: zyz218    时间: 2005-10-25 17:58
好文章要顶
作者: yf56789    时间: 2005-11-25 03:06
值得学习的好文章,感谢阿罗
作者: friendship    时间: 2006-6-24 15:05
好文章! 只是发现的迟哟!
作者: 黄林    时间: 2006-8-10 04:18
hhhhhhhhh
作者: kangking    时间: 2006-11-3 21:38
收录了,慢慢品!谢谢!
作者: mangguopai    时间: 2006-11-25 01:01
可以评为本年最佳文章!


可以评为本年最佳文章!


可以评为本年最佳文章!


可以评为本年最佳文章!


可以评为本年最佳文章!

作者: huangqinyong    时间: 2007-3-8 19:45
thanks.........
作者: fengtao666    时间: 2007-8-1 11:33
写得怎么不错,顶一下
作者: wgh2007    时间: 2007-8-3 15:45
标题: 可以评为本年最佳文章!
佩服佩服真佩服!
作者: 小宜    时间: 2007-11-23 20:11
学习!学习!学习!学习!学习!
作者: rcylbx    时间: 2007-12-10 21:55
学习,学习,再学习
作者: bach    时间: 2007-12-26 04:10
好文章
作者: cyjdl    时间: 2008-4-24 17:40
好!
作者: rym_yy    时间: 2008-5-19 10:50
学习
作者: duomu    时间: 2008-8-19 20:04
非常不错,学习了
作者: yiwancn    时间: 2008-10-6 19:25
对你的无私奉献致以崇高敬意!
作者: chenyingfengsx    时间: 2009-12-3 11:13
学些
作者: 文棣    时间: 2009-12-12 19:41
学习有益 ,感谢
作者: Dmeilin830    时间: 2010-11-1 16:58
很好的帖子。谢谢了。
作者: william_yao    时间: 2010-11-26 11:41
学习一下
作者: zhuyiwen    时间: 2012-12-1 13:30
此文为不可多得的 ADP 方面专题文章,设为本版置顶、加精、高亮。
作者: gdjdyyj    时间: 2013-6-28 09:52
学习!!!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3