vb.net - 查找 Access 版本

标签 vb.net ms-access

下面的代码确定了 Access 的版本。 它在大多数 PC 上运行速度很快。我们还有四台终端服务器。在两台终端服务器上它运行良好。在另外两个上,此代码的运行时间超过 15 秒。

所有四个终端服务器都有 Access 2003 运行时。我不明白为什么在两台服务器上运行需要更长的时间。会是权限吗?或者 Access 运行时的安装方式出现错误?

如果有更好、更快的方法来确定版本,我也会对此感兴趣。 谢谢 太棒了

   ' Determine the Access version by creating an
   ' Access.Application object and looking at
   ' its Version property.
   Private Function GetAccessVersionName() As String
      Dim obj As Object = CreateObject("Access.Application")
      Dim result As String = "Access.Application." & _
          obj.Version
      obj.Quit()
      Return result
   End Function

   ' Get the Access version number from the name.
   Private Function GetAccessVersionNumber() As Integer
      Dim txt As String = GetAccessVersionName()
      Dim pos2 As Integer = txt.LastIndexOf(".")
      Dim pos1 As Integer = txt.LastIndexOf(".", pos2 - 1)
      txt = txt.Substring(pos1 + 1, pos2 - pos1 - 1)
      Return CInt(txt)
   End Function

   ' Get the nice style of the Access version name.
   Public Function GetAccessVersionNiceName() As String

      Try
         Select Case GetAccessVersionNumber()
            Case 8
               Return "Access 97"
            Case 9
               Return "Access 2000"
            Case 10
               Return "Access XP" 
            Case 11
               Return "Access 2003"
            Case 12
               Return "Access 2007"
            Case Else
               Return "unknown"
         End Select
      Catch ex As Exception
         Return "unknown"
      End Try

   End Function

最佳答案

我认为问题出在对CreateObject()的调用上。这将运行 Access,我猜在某些机器上可能需要 15 秒。这是获取版本号的另一种方法,它应该要快得多 - 它使用注册表中的信息。

Imports Microsoft.Win32

Public Class AccessInterop
    Public Shared Function GetAccessVersionNiceName() As String
        Try
            Dim ClassName As String = GetAccessClassName()
            Select Case GetAccessVersionNumber(ClassName)
                Case 8
                    Return "Access 97"
                Case 9
                    Return "Access 2000"
                Case 10
                    Return "Access XP"
                Case 11
                    Return "Access 2003"
                Case 12
                    Return "Access 2007"
                Case 13
                    Return "Access 2010"
                Case Else
                    Return "unknown"
            End Select
        Catch ex As Exception
            Return "unknown"
        End Try
    End Function

    Private Shared Function GetAccessClassName() As String
        Dim RegKey As RegistryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("Access.Application\CurVer")
        If RegKey Is Nothing Then
            Throw New ApplicationException("Can not find MS Access version number in registry")
        Else
            Return RegKey.GetValue("")
        End If
    End Function

    Public Shared Function GetAccessVersionNumber(ByVal ClassName As String) As Integer
        Dim VersionNumber As String = ClassName
        While VersionNumber.IndexOf(".") > -1
            VersionNumber = VersionNumber.Substring(VersionNumber.IndexOf(".") + 1)
        End While
        Return VersionNumber.Trim
    End Function
End Class

关于vb.net - 查找 Access 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2020181/

相关文章:

oracle - Access 2007导出表到CSV十进制

javascript - 如何在 GridView 的 OnLoad 事件上调用 javascript 函数?

.net - VB.NET中可靠的网络重新连接循环

c# - Vb.Net Windows 应用程序到 C#

sql-server-2008 - 通过 VBA 从传递查询返回值

c# - Access 查询中数据类型不匹配异常

vb.net - 正确关闭在新线程中运行循环的表单

.net - 如何实现接口(interface)的默认方法?

MySQL 或 Access : Add a : to the end of a column in MySQL

forms - 当 Modal 和 Popup 设置为 True 时,MS Access 表单会调整大小