【问题标题】:Unable to connect to Teradata through VBA macro with mechanism as LDAP无法通过具有 LDAP 机制的 VBA 宏连接到 Teradata
【发布时间】:2017-12-21 12:58:04
【问题描述】:

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

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

无法连接到“LDAP”机制,即使在上述代码中包含“身份验证”作为 LDAP 后,它也会抛出 Userid/password is invalid

【问题讨论】:

  • 尝试“用户 ID=”而不是“Uid=!”和“密码=”而不是“密码=”。您还可以添加“;持久安全信息=True;会话模式=ANSI;”到你的字符串。
  • 我尝试了同样的方法,但仍然无法连接到 LDAP 机制..
  • 到达那个点时变量的值是多少?你有Option Explicit 来确保没有错别字吗?
  • 我使用了下面的代码 "conn.Open "Driver={Teradata};" & _ "Persist Security Info=True;Session Mode=ANSI;" & _ "DBCName=" & TDServer & ";" & _ "Database=" & TDDb & ";" & _ "UserID=" & TDUname & ";" & _ "Password=" & TDPword & ""
  • @SeanC:我试过了,但还是没有成功

标签: vba excel teradata


【解决方案1】:

通过非默认身份验证机制连接时,需要指定身份验证机制。您可以使用 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

【讨论】:

  • 会认为 LOGMECH 优于 AUTHENTICATION。很好的sn-p代码已经隐藏起来了。
  • @RobPaller 可能是 ODBC 驱动程序版本不同。我可以发誓我记得很久以前使用过 LOGMECH(或者可能是在 OLEDB 连接字符串中......)我不记得了
  • @JNevill :我之前使用相同的代码连接到 stage 和 prod,现在 Prod 凭据具有 LDAP 机制,因此无法连接相同的并且上面的代码现在可以完美地连接到 Production 。 . 如果我必须再次连接到舞台,我必须删除 Auth 机制并运行它.. 有没有办法使用相同的代码来连接到舞台(没有 LDAP)和 Prod(使用 LDAP)具有相同的模板
  • 当然可以。这只是一个函数,函数可以带参数。您的参数可以是用于生产的布尔值(真/假)(作为一种可能的解决方案)。我将使用可以像这样工作的功能版本更新答案,您可以根据需要对其进行调整。
  • 没有。我无法通过您的工作簿的错误以及随之而来的所有错误来调试我的方式。你遇到了什么错误?如果它足够复杂,可能需要向 SO 提出一个新问题,以便其他人可以加入并提供支持。
【解决方案2】:

除了上面提供的解决方案之外,还尝试了另一种技术,为身份验证机制分配一个变量,并使用 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

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 2021-03-15
    • 2018-09-06
    • 2011-09-25
    • 2011-02-18
    • 2012-08-30
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    相关资源
    最近更新 更多