【问题标题】:Provider OraOLEDB.Oracle does not return right results for vba提供者 OraOLEDB.Oracle 没有为 vba 返回正确的结果
【发布时间】:2013-03-01 19:13:02
【问题描述】:

我有这个 .xls vba 代码,我试图在其中检查记录计数并根据该代码决定进一步的逻辑。

这个 vba 在 Provider = MSDAORA 上运行良好,但是当我更改为 Provider = OraOLEDB.Oracle 时,这个 vba 检查查询总是返回记录数 = 0

使用 OraOLEDB.Oracle 的所有其他查询都可以正常工作。

附上代码。

提前感谢您在这里指出问题。

Public Function CheckJob(BusDate As String, JobName As String) As Boolean
Dim Cnt As ADODB.Connection, rst As ADODB.Recordset
Dim cmdGetComp As New ADODB.Command   
Dim RecCount As Integer
Dim rng As Range
Dim StConn As String
Dim Sql As String

StConn = strETDDBConnStringADO()'This is connection string with all credentials
Set Cnt = New ADODB.Connection
Set rst = New ADODB.Recordset
Set cmdGetComp = New ADODB.Command

Sql = "Select Count(*) from XYZ_DBO.TABLE_STATUS where BUSINESS_DATE='XXXXXX'"


With Cnt
.Open (StConn)

With cmdGetComp
    .ActiveConnection = Cnt ' Reference to a Connection object.
    .CommandType = adCmdText
    .CommandText = Sql
     Set rst = .Execute() ' Set the Recordset to the results of executing the query
End With

RecCount = rst(0)  'rst(0) always return value of 0 even if manual query have 1 record
.Close
End With
If RecCount > 0 Then   
CheckJob = True
Else
CheckJob = False
End If
End Function

【问题讨论】:

  • 考虑改变你的标题,它应该准确地定义你的问题,而不是声明数据库是错误的。更有可能是甲骨文错了还是你错了?
  • BUSINESS_DATE 列的数据类型是什么?是DATE 吗?还是VARCHAR2?你把它比作约会吗?还是字符串?
  • 贾斯汀,BUSINESS_DATE 是 DATE 格式,我最近尝试了代码,如果我删除 Business Date 条件,它工作得很好,所以我传递 Business_date 的方式有问题。你能举个例子吗,我想我应该没问题。
  • 我将 BusDate As String 提供为 BUSINESS_DATE
  • @user973842 - 您的查询中的'XXXXXX' 是什么?那是一个硬编码的字符串吗?那个字符串是什么格式的? BUSINESS_DATE 的时间分量是多少?你保证时间组件是午夜吗?

标签: vba vb6 oracle11g provider


【解决方案1】:

MSDAORA 似乎对某些转换更直观,而 OraOLEDB.Oracle 更明确。

因此,虽然 MSDAORA 在与日期列进行比较时会将“01-JAN-2015”理解为有效日期,但 OraOLEDB.Oracle 要求将字符串转换为日期,例如 to_date('01-JAN-2015' , 'DD-MON-YYYY')。

TLDR:

Sql = "Select Count(*) from XYZ_DBO.TABLE_STATUS where BUSINESS_DATE='XXXXXXXX'"

应该变成类似(取决于 BUSINESS_DATE 数据类型)

Sql = "Select Count(*) from XYZ_DBO.TABLE_STATUS where BUSINESS_DATE= to_date('XXXXXXXX','MMDDYYYY')"

【讨论】:

    【解决方案2】:

    在连接字符串中使用 UseSessionFormat=True,因此它始终使用 Oracle 默认日期格式。

    connectionString = "PROVIDER=OraOLEDB.Oracle;Persist Security Info=True;UseSessionFormat=True;USER ID=XXXX;PASSWORD=XXXX;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST) =XXX)(PORT=XXXX)))(CONNECT_DATA=(SID=XXXX)(SERVER=DEDICATED)))""

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2023-03-14
      • 2014-09-13
      • 2012-08-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多