在Oracle的VBA中显示为问号的西里尔字母

在Oracle的VBA中显示为问号的西里尔字母,vba,oracle,excel,cyrillic,Vba,Oracle,Excel,Cyrillic,使用ADODB.RecordSet(MS ActiveX Data Objects 2.8库)在Excel电子表格上显示Clob字段(Oracle)中的西里尔字母时出现问题 例如,我创建了一个带有一个Clob字段的表。我只插入了一行西里尔字母,并试图在Excel电子表格上显示该值。但是,文本显示为????在Msgbox和单元格中。这仅在从Clob字段获取值时发生。如果我们从varchar查询它们,效果很好。我试过11.2.0.2.0和12.2.0.1.0。行为是一样的。我们能做些什么来解决这个问

使用ADODB.RecordSet(MS ActiveX Data Objects 2.8库)在Excel电子表格上显示Clob字段(Oracle)中的西里尔字母时出现问题

例如,我创建了一个带有一个Clob字段的表。我只插入了一行西里尔字母,并试图在Excel电子表格上显示该值。但是,文本显示为????在Msgbox和单元格中。这仅在从Clob字段获取值时发生。如果我们从varchar查询它们,效果很好。我试过11.2.0.2.0和12.2.0.1.0。行为是一样的。我们能做些什么来解决这个问题

数据库中的NLS_字符集为AL32UTF8

VBA代码如下所示:

Private Sub UnloadReportBtn_Click()
    Dim RecordSet As ADODB.RecordSet

    Set RecordSet = getTestClob

    While RecordSet.EOF = False
        MsgBox RecordSet.Fields("TEST1")

        Cells(7, 7) = RecordSet.Fields("TEST1")

        RecordSet.MoveNext
    Wend
End Sub

Public Function getTestClob()
    Dim Query As String

    Query = "SELECT TEST1 FROM TEST_CLOB"

    Set getTestClob = getRecordSet(Query)
End Function

Public Function getRecordSet(Query As String) As ADODB.RecordSet
    Dim SQLCommand As ADODB.Command

    Dim RecordSet As ADODB.RecordSet

    Set SQLCommand = New ADODB.Command
    Set SQLCommand.ActiveConnection = Connection

    SQLCommand.CommandText = Query
    SQLCommand.CommandType = adCmdText
    SQLCommand.CommandTimeout = 0

    Set getRecordSet = SQLCommand.execute
End Function

将您的
NLS_LANG
值设置为支持西里尔字母字符的字符集,例如
CL8MSWIN1251
AL32UTF8

例如,您可以通过环境变量来实现这一点

SET NLS_LANG=AMERICAN_RUSSIA.CL8MSWIN1251
或在您的注册表中,位于
HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY\u%ORACLE\u HOME\u NAME%\NLS\u LANG
(32位),分别<代码>HKLM\SOFTWARE\ORACLE\KEY\u%ORACLE\u HOME\u NAME%\NLS\u LANG用于64位


有关更多详细信息,请参见。

也许本文可以帮助您:您的
NLS_LANG
值是多少?@hotfix,这没有帮助,因为您已经从数据库中获取了
,所以您无法转换任何内容。非常感谢!我添加了Env var NLS_LANG=rusian_rusia.CL8MSWIN1251,现在运行良好。