无法使用 LDAP 机制通过 VBA 宏连接到 Teradata

Unable to connect to Teradata through VBA macro with mechanism as LDAP

尝试使用以下代码连接到 Teradata,它工作正常

  Worksheets("BO").range("A:C").Clearcontents
  conn.Open "Driver={Teradata};" & _
  "DBCName=" & TDServer & ";" & _
  "Database=" & TDDb & ";" & _
  "Uid=" & TDUname & ";" & _
  "Pwd=" & TDPword & ""

无法连接到 "LDAP" 机制并且它正在抛出 Userid/password 即使在上面的代码中包含 "Authentication" 作为 LDAP 之后也是无效的

在通过非默认身份验证机制连接时指定您的身份验证机制是必要的。您可以使用 Authentication 设置在 ODBC 连接字符串中执行此操作。

你的情况:

conn.Open "Driver={Teradata};" & _
  "DBCName=" & TDServer & ";" & _
  "Database=" & TDDb & ";" & _
  "Uid=" & TDUname & ";" & _
  "Pwd=" & TDPword & ";" & _
  "Authentication=LDAP"

连接字符串中需要考虑的其他一些非常有用的设置:

SessionMode。这应该默认为 "Teradata",但我想指定以防万一,因为如果你发现自己处于 ANSI 模式,你必须更明确地说明你的 SQL。

  "SessionMode=Teradata" 

CharSet 默认为 ASCII 这可能适合您的需要,但如果您有任何 Unicode 数据,则需要在连接字符串中指定一个 Unicode 字符集避免 Unicode 字符被简化为 ASCII(问号和空框是常见的替换)

  "CharSet=UTF8"

例如,这是我多年来一直用来处理 LDAP 连接的连接函数:

Public adoConn as ADODB.Connection
Private username as string
Private password as string

<other supporting functions here like getUsername and getPassword>

Function openConnection() As Boolean
    Dim ServerName As String, DatabaseName As String
    Set adoConn = New ADODB.Connection

    On Error GoTo ErrorHandler
startOver:
    If m_db.username = "" Or m_db.password = "" Then
        getUsername
        getPassword
    End If

    'ldap
    adoConn.Open "SessionMode=Teradata;Driver=Teradata;Authentication=LDAP;DBCName=mydb.somewhere.com;Database=mydb;CharSet=UTF8;Uid=" & username & ";Pwd=" & password        

    Exit Function
ErrorHandler:
     If Err.Number = -2147217843 Then
        yesno = MsgBox("Your username or password was incorrect." & vbCrLf & vbCrLf & "Try Again?", vbYesNo)
        If yesno = vbYes Then
            m_db.password = ""
            GoTo startOver
        End If
    End If
    Debug.Print Err.Description, Err.Number        
End Function

更新一个可以使用参数切换 ldap 功能的版本:

Public adoConn as ADODB.Connection
Private username as string
Private password as string

<other supporting functions here like getUsername and getPassword>

Function openConnection(ldap as boolean) As Boolean
    Dim ServerName As String
    Dim DatabaseName As String
    Dim strConnection as string
    Set adoConn = New ADODB.Connection

    On Error GoTo ErrorHandler
startOver:
    If m_db.username = "" Or m_db.password = "" Then
        getUsername
        getPassword
    End If

    'ldap        
    If ldap Then 
        strConnection = "SessionMode=Teradata;Driver=Teradata;Authentication=LDAP;DBCName=mydb.somewhere.com;Database=mydb;CharSet=UTF8;Uid=" & username & ";Pwd=" & password  
    Else 'not ldap      
         strConnection = "SessionMode=Teradata;Driver=Teradata;DBCName=mydb.somewhere.com;Database=mydb;CharSet=UTF8;Uid=" & username & ";Pwd=" & password  
    End If

    'open the connection
    adoConn.Open strConnection

    Exit Function
ErrorHandler:
     If Err.Number = -2147217843 Then
        yesno = MsgBox("Your username or password was incorrect." & vbCrLf & vbCrLf & "Try Again?", vbYesNo)
        If yesno = vbYes Then
            m_db.password = ""
            GoTo startOver
        End If
    End If
    Debug.Print Err.Description, Err.Number        
End Function

您现在可以这样称呼:

Set connTeradataProd = openConnection(True) 'for ldap
Set connTeradataStage = openConnection(False) 'for default auth

除了上面提供的解决方案之外,还尝试了另一种技术,为身份验证机制分配一个变量,通过使用 if else 循环,我们可以 运行 相同

 If (LDAPString = "LDAP") Then

 Conn.Open "Driver={Teradata};" & _
"DBCName=" & TDServer & ";" & _
"Database=" & TDDb & ";" & _
"Uid=" & TDUname & ";" & _
"Pwd=" & TDPword & ";" & _
"Authentication=LDAP"

 Else

 Conn.Open "Driver={Teradata};" & _
"DBCName=" & TDServer & ";" & _
"Database=" & TDDb & ";" & _
"Uid=" & TDUname & ";" & _
"Pwd=" & TDPword & ""

End If