【问题标题】:Oracle and ADO Query from Excel returns no resultsExcel 中的 Oracle 和 ADO 查询不返回任何结果
【发布时间】:2013-10-24 17:56:48
【问题描述】:

我无法使用 Oracle OraOLEDB.Oracle Provider 在 Excel 2010 VBA 代码中运行查询。

某些查询工作正常并返回结果,而其他查询则不返回任何结果...

我是这样连接的:

 Set DBConnection = New ADODB.Connection
    DBConnection.Provider = "OraOLEDB.Oracle"
    DBConnection.CursorLocation = adUseClient
    DBConnection.ConnectionString = "Data Source=" & TNSName & ";User Id=" & OraUserName & ";Password=" & OraPassWord & ";"
    DBConnection.Open

然后我尝试查询:

command2.ActiveConnection = DBConnection
command2.CommandText = "SELECT COL1,COL2,COL3 FROM table(MySchema.MyPackage.MyFunction('Param1'))"
command2.CommandType = adCmdText

Set QueryRecordSet = New ADODB.Recordset
QueryRecordSet.LockType = adLockReadOnly
QueryRecordSet.CursorType = adOpenDynamic
QueryRecordSet.Open command2


command2.Execute

我什么也没得到……有什么想法吗?

如果我运行一个简单的查询,例如

select * From my_table

它工作正常...似乎连接或其他更复杂的查询无法编译??

此外,从视图中选择也不起作用。

select * from my_view

什么都不返回

【问题讨论】:

  • 我想我也应该注意这些函数都在一个包中。
  • 我也遇到过很多关于 CTE(带有声明)不能与 ADO 一起使用的帖子。很高兴听取 ADO 专家的意见,为什么不简单地将查询传递给数据库? ADO 试图解析这个查询做什么?为什么它会默默地失败?
  • 你试过DBConnection.CursorLocation = adUseServer吗?
  • MySchema.MyPackage.MyFunction() 的代码中可能有错误。你能发布这个函数的确切代码吗?如果没有,尝试放置一个简单的代码返回记录集而不是当前函数体,看看函数是否返回结果集。
  • @ThinkJet - 是的,我尝试了所有可能的连接属性排列。如果您从 SQL 中调用该函数,该函数可以完美运行……但我肯定会在今天晚些时候发布代码。

标签: oracle vba excel excel-2010 ado


【解决方案1】:

我将其作为答案只是因为注释格式不允许我添加代码。

如果通过命令对象单独运行,存储过程是否有效?

command2.CommandText = "MySchema.MyPackage.MyFunction"
command2.CommandType = adCmdStoredProc
command2.Parameters.Refresh
command2.Parameters.Item(1).Value = "Param1"
command2.Execute
Debug.Print command2.Parameters.Item(0).Value

【讨论】:

    【解决方案2】:

    我不确定这就是你要找的。我正在寻找另一个答案,我知道这对我有用。

        Set cmdSum = New adodb.Command
    
    With cmdSum
        Set .ActiveConnection = oCon
        .Properties("PLSQLRSet") = True
        .CommandText = "{CALL StoredProc(?,?)}"
        .CommandType = adCmdText
        .Parameters.Append .CreateParameter(, adVarChar, adParamInput, 10, Format(CDate(sTerm), "mm/dd/yyyy"))
        .Parameters.Append .CreateParameter(, adVarChar, adParamInput, 10, Format(CDate(sEff), "mm/dd/yyyy"))
    End With
    
    Set Rs = cmdSum.Execute()
    
    For c = 0 To Rs.Fields.Count - 1
        Wk.Cells(3, c + 1) = Rs.Fields(c).Name
    Next c
    

    【讨论】:

      【解决方案3】:

      在对 Oracle 的 Excel ADO 查询不起作用后,我最终来到了这里。

      虽然它在问题的 cmets 中声明您可以使用 ODBC 来解决这个问题,但我花了一段时间才弄清楚如何让 ODBC 连接字符串正常工作。

      这是我开始使用的到 Oracle 的 ODBC 连接。

      dbConn = "ODBC;Provider=OraOLEDB.Oracle;" & _
               "Data Source=odbc_connection_name;" & _
               "User Id=user_id;" & _
               "Password=user_pwd;" & _
               "DBQ=tns_name;"
      

      tns_name 是您在 tnsnames.ora 文件中为您的连接命名的名称。

      odbc_connection_name 是您命名 odbc 连接的名称。

      然后你可以像往常一样使用 ADO 连接到 Oracle:

      cn.Open dbConn
      cn.CommandTimeout = 1000
      rs.Open sql, cn
      

      注意我还必须增加CommandTimeout 属性,因为 ODBC 的默认超时时间相对较短。

      【讨论】:

        猜你喜欢
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-25
        相关资源
        最近更新 更多