【问题标题】:Cyrillic letter displaying as question marks in VBA from Oracle西里尔字母在 Oracle 的 VBA 中显示为问号
【发布时间】:2018-08-08 06:54:14
【问题描述】:

我们在使用 ADODB.RecordSet(MS ActiveX 数据对象 2.8 库)在 Excel 电子表格上显示 Clob 字段 (Oracle) 中的西里尔字母时遇到问题。

例如,我创建了一个包含一个 Clob 字段的表。我只插入了一行西里尔字母,并试图在 Excel 电子表格上显示该值。但是,文本显示为 ????在 Msgbox 和单元格中。这仅在从 Clob 字段中获取值时发生。如果我们从 varchar 查询它们,它工作正常。我已经尝试过 11.2.0.2.0 和 12.2.0.1.0。行为是相同的。我们可以做些什么来解决这个问题?

db 中的 NLS_CHARACTERSET 是 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

【问题讨论】:

标签: vba oracle excel cyrillic


【解决方案1】:

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

你可以通过环境变量来做到这一点,例如

SET NLS_LANG=AMERICAN_RUSSIA.CL8MSWIN1251

或在您的注册表中HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG(对于 32 位),分别。 HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG 用于 64 位。

有关更多详细信息,另请参阅OdbcConnection returning Chinese Characters as "?"。

【讨论】:

  • 非常感谢!我添加了 Env var NLS_LANG=RUSSIAN_RUSSIA.CL8MSWIN1251,现在可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 2013-08-13
  • 1970-01-01
相关资源
最近更新 更多