【问题标题】:Datatype mismatch when reading recordset in vba access在 vba 访问中读取记录集时数据类型不匹配
【发布时间】:2017-08-10 03:53:44
【问题描述】:

我想根据几个条件进行计算,所以我尝试使用

CurrentDb.OpenRecordset

拳头我通过在 Ms Access 中创建查询来检查查询是否有效,它有效并返回了我想要的答案,所以我在我的 VBA 代码中应用了 select 语句但它不起作用,它给了我错误(类型不匹配)在:

TOTER = CurrentDb.OpenRecordset("SELECT " & _ ..est

为什么它在没有 VBA 的情况下也能完美运行?我的代码中缺少什么? 我把它放在一个函数中

GET_TOTER()

并从

调用函数

TABLE_x_NEW()

  Option Compare Database
Option Explicit

Public cnn As New ADODB.Connection
Public db As DAO.Database

Public Sub SUb_Main()
    Set db = Access.Application.CurrentDb
    Set cnn = CurrentProject.Connection
TABLE_x_NEW
End Sub

Private Sub TABLE_x_NEW()
    Dim sql As String
    Dim SDATA As New ADODB.Recordset
    Dim TX As DAO.Recordset
    Set TX = db.OpenRecordset("TABLE_x")

    sql = "SELECT * FROM TABLE_z"
    SDATA.Open sql, cnn, adOpenStatic

    If SDATA.RecordCount <> 0 Then
        Do Until SDATA.EOF
        DoEvents
            TX.AddNew
            TX!P_ID = SDATA!P_ID
            TX!Pdate = SDATA!Pdate
            TX!W_TOTER = GET_TOTER(TX!Pdate, TX!P_ID)
            TX.Update
            SDATA.MoveNext
            Loop
        End If
    End Sub

Private Function GET_TOTER(Pdate As Date, PID As String) As Double

    Dim sql As String
    Dim SDATA As New ADODB.Recordset
    Dim COUN As Long
    Dim TOTER As Double  
             sql = "SELECT DISTINCT (NID) FROM TABLE_A WHERE P_ID='" & PID & "' AND PTYPE IN ('HP','TOS')"
             SDATA.Open sql, cnn, adOpenStatic

    If SDATA.RecordCount <> 0 Then

          COUN = CurrentDb.OpenRecordset("SELECT COUNT(*)FROM TABLE_B WHERE APId = '" & SDATA!NID & "' " & _
        "AND MONTH(W_DATE)=" & Month(Pdate) & " AND YEAR(W_DATE)=" & Year(Pdate) & "").Fields(0).Value

        If (0 >= COUN >= 3) Then        
              TOTER = CurrentDb.OpenRecordset("SELECT " & _
            "(DAvg(""[W_RATE]"",""TABLE_B"",""[APId] = '" & SDATA!NID & "' AND MONTH([WELL_TEST_DATE])=' & Month(Pdate) & ' AND YEAR([WELL_TEST_DATE])= ' & Year(Pdate) & ' "") " & _
           " -DStDev(""[W_RATE]"", ""TABLE_B"", ""[APId] = '" & SDATA!NID & "' AND MONTH([WELL_TEST_DATE])=' & Month(Pdate) & ' AND YEAR([WELL_TEST_DATE])= ' & Year(Pdate) & ' ""))" & _
           " / DAvg(""[W_RATE]"",""TABLE_B"",""[APId] = '" & SDATA!NID & "' AND MONTH([WELL_TEST_DATE])=' & Month(Pdate) & ' AND YEAR([WELL_TEST_DATE])= ' & Year(Pdate) & ' "") *100 " & _
           " +(20 * (1- COUNT(APId)/3)) + 5 " & _
           " FROM TABLE_B" & _
           " WHERE Month(W_DATE) = ' & Month(Pdate) & '  AND Year(W_DATE)= ' & Year(Pdate) & '  AND APId = '" & SDATA!NID & "' HAVING  COUNT(APId) BETWEEN 0 AND 3")
            GET_TOTER = TOTER     
           ELSE
          GET_TOTER=0        
        End If

             SDATA.Close
        End If   
End Function

【问题讨论】:

    标签: sql vba ms-access


    【解决方案1】:

    OpenRecordset 的调用返回的是RecordSet,而不是Double。您只需要更改检索数据的方式,如下所示:

    Set MyRecordSet = CurrentDb.OpenRecordset("SELECT " & _
    Toter = MyRecordSet.Fields(0).Value
    

    【讨论】:

    • 我没有注意到我忘记在记录集中添加 '.Fields(0).Value '!谢谢你..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2014-05-12
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多