无法使用 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
尝试使用以下代码连接到 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