在使用 vb6 代码创建之前检查现有的 DSN

Check for existing DSN before creating it with vb6 code

我已经使用 DSN 建立了一个连接,我在其中创建了一个 DSN throgh 程序。因为我已经调用了一个函数来创建一个 DSN,所以我不想调用该函数 ecerytime i 运行 软件,相反我想检查系统中是否已经存在同名的 dsn,如果它不存在然后只调用函数`

Public Sub ConnectDB(Con As ADODB.Connection)

Call CreatSQLDSN("TRDSN", VarSrvNm, VarDbName)
If Cn.State = 1 Then Cn.Close
On Error Resume Next
Con.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;User ID=sa;Data Source=TRDSN;Initial Catalog='" & VarDbName & "'"

Con.Open Con.ConnectionString
If Err.Number <> 0 Then
If Err.Number = -2147467259 Then
    If MsgBox(ServerName & " Server not Found. Connect to Other Server?", vbQuestion + vbDefaultButton2 + vbYesNo, "") = vbYes Then
        PrintFile = Trim(Left(FindWindowPath, 3) & "DosPrint.Bat")
        FileSystemObject.CreateTextFile PrintFile, True
        Set TextStream = FileSystemObject.OpenTextFile(PrintFile, ForAppending)
        TextStream.WriteLine "Del " & Left(FindWindowPath, 3) & "ServerName.dat"
        TextStream.Close
        Shell PrintFile, vbHide
    End If
    End
Else
If MsgBox(Err.Description, vbQuestion + vbOKOnly, "") = vbOK Then
        Cancel = True
        Exit Sub
    End If
End If
End If
0
End Sub

Public Function CreatSQLDSN(SqlDsnName As String, SqlServerName As String, SqlDataName As String)
Dim Ret%, Driver$, Attributes$
Driver = "SQL Server" & Chr(0)
Attributes = "Server=" & SqlServerName & Chr(0)
Attributes = Attributes & "DSN=" & SqlDsnName & Chr(0)
Attributes = Attributes & "Database=" & SqlDataName & Chr(0)
Ret = SQLConfigDataSource(vbAPINull, ODBC_Add_User_DSN, Driver, Attributes)

'ret is equal to 1 on success and 0 if there is an error
If Ret <> 1 Then
    MsgBox "User DSN Creation Failed"
End If
End Function`

当需要知道 DSN 是否存在时,会想到几个选项。您可以通读注册表,或利用现有的 API 调用。我更喜欢第二种选择。这似乎是检查 DSN 是否存在的一种更简洁的方法。这是我正在谈论的示例:

Option Explicit

Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

Private Const ODBC_ADD_DSN = 1
Private Const ODBC_CONFIG_DSN = 2
Private Const ODBC_REMOVE_DSN = 3
Private Const ODBC_ADD_SYS_DSN = 4
Private Const ODBC_CONFIG_SYS_DSN = 5
Private Const ODBC_REMOVE_SYS_DSN = 6
Private Const ODBC_REMOVE_DEFAULT_DSN = 7

Private Sub cmdCreate_Click()
   Dim VarSrvNm As String
   Dim VarDbName As String

   VarSrvNm = "MyServer"
   VarDbName = "MyDB"

   If Not SQLDSNExists("TRDSN", VarSrvNm, VarDbName) Then
      If Not CreateSQLDSN("TRDSN", VarSrvNm, VarDbName) Then
         MsgBox "User DSN Creation Failed"
      End If
   End If
End Sub

Public Function CreateSQLDSN(SqlDsnName As String, SqlServerName As String, SqlDataName As String) As Boolean
   Dim Ret%, Driver$, Attributes$

   Driver = "SQL Server" & Chr(0)
   Attributes = "Server=" & SqlServerName & Chr(0)
   Attributes = Attributes & "DSN=" & SqlDsnName & Chr(0)
   Attributes = Attributes & "Database=" & SqlDataName & Chr(0)

   Ret = SQLConfigDataSource(0&, ODBC_ADD_DSN, Driver, Attributes)

   'ret is equal to 1 on success and 0 if there is an error
   CreateSQLDSN = (Ret = 1)
End Function

Public Function SQLDSNExists(SqlDsnName As String, SqlServerName As String, SqlDataName As String) As Boolean
   Dim Ret%, Driver$, Attributes$

   Driver = "SQL Server" & Chr(0)
   Attributes = "Server=" & SqlServerName & Chr(0)
   Attributes = Attributes & "DSN=" & SqlDsnName & Chr(0)
   Attributes = Attributes & "Database=" & SqlDataName & Chr(0)

   Ret = SQLConfigDataSource(0&, ODBC_CONFIG_DSN, Driver, Attributes)

   'ret is equal to 1 on success and 0 if there is an error
   SQLDSNExists = (Ret = 1)
End Function

这里的主要思路是尝试修改你要添加的DSN。如果调用失败,则DSN不存在。