Doug Booth Ответов: 1

Как настроить объект команды ADO для представления, а не для хранимой процедуры?


Я использую MS Access 2013 для подключения к 2 представлениям в базе данных Caché с помощью DSN. Я связал эти представления как таблицы с успехом, но мы хотим ограничить соединение выборкой во время вызова функции, а не связанной "таблицей". Я ничего не нахожу в интернете об использовании ADO 2.8 для настройки командного объекта для представления. Для представления не существует типа команды. В зависимости от выбранного типа команды я либо получаю сообщение об ошибке, указывающее, что мне нужно предоставить текст SQL, либо вообще не возвращаю никаких записей. Состояние объекта подключения в порядке.

Что я уже пробовал:

Я пробовал каждый тип команды и несколько различных способов вызова возврата набора записей. Вот тестовая процедура, которую я использовал для игры с этим кодом:

Public Function TestADO()
    Dim adoConn As ADODB.Connection
    Dim adoCmd As ADODB.Command
    Dim adoRs As ADODB.Recordset
    Const DSN = "CWSCACHEMSACCESS" 'The name of my tested DSN
    Const ALLERGY_VIEW = "SYSTEM.client_allergies_nondrug" 'The name of my View
   
    Set adoConn = New ADODB.Connection
   
    'open the connection
    adoConn.Open DSN
   
    If adoConn.State = adStateOpen Then
        MsgBox "Connection Open"
    Else
        MsgBox "Connection Not Opening"
        GoTo proc_exit
    End If
   
    'Open the view and get contents into recordset
    Set adoCmd = New ADODB.Command
   
   
    With adoCmd
        Set .ActiveConnection = adoConn
        .CommandType = adCmdText 'have tried all options
        .CommandText = ALLERGY_VIEW
        .CommandTimeout = 120
       
        Set adoRs = adoCmd.Execute
        'The following doesn't work either:
        '===================================
        'Set adoRs = New ADODB.Recordset
        'adoRs.Open adoCmd, adoConn, adOpenStatic, adLockReadOnly
    End With
   
    'close the connection
    'adoConn.Close
   
    MsgBox "RS Count: " & adoRs.RecordCount & vbCrLf & "RS BOF: " & adoRs.BOF & vbCrLf & "RS EOF: " & adoRs.EOF
   
proc_exit:
    On Error Resume Next
    adoConn.Close
    Set adoConn = Nothing
    Set adoCmd = Nothing
    Set adoRs = Nothing
    Exit Function

proc_err:
    MsgBox Err.Number & ": " & Err.Description, vbCritical, "TestADO() Error"
    Resume proc_exit
End Function

PIEBALDconsult

Ты не можешь.

_Asif_

Представления доступны как таблицы (они не имеют специализированного синтаксиса) , и правильный синтаксис будет выглядеть следующим образом
Выберите * из client_allergies_nondrug. То есть :
. CommandText = " SELECT * FROM client_allergies_nondrug";

1 Ответов

Рейтинг:
2

Doug Booth

Спасибо, PIEBALDconsult, это была важная информация для меня. Я консультировался с нашими авторами отчетов, которые весь день запускают SQL против базы данных кэша, и мы решили попробовать вытащить только одно поле. Я все еще получаю пустой набор записей, но, по крайней мере, никаких ошибок. Помните, что я использую это представление в качестве связанной таблицы в Access в течение нескольких месяцев без проблем (за исключением случаев, когда возникают перебои в работе сети, что приводит к изменению подхода к извлечению записей). Я использую тот же DSN, и соединение открывается нормально.

Вот мой пересмотренный код, который не возвращает никаких записей:

Public Function TestADO()
    Dim adoConn As ADODB.Connection
    Dim adoCmd As ADODB.Command
    Dim adoRs As ADODB.Recordset
    Const DSN = "CWSCACHEMSACCESS"
    Const ALLERGY_VIEW = "SYSTEM.client_allergies_nondrug"
    Const DIETARY_VIEW = "SYSTEM.active_diet_order"
    
    Set adoConn = New ADODB.Connection
    
    'open the connection
    adoConn.Open DSN
    
    If adoConn.State = adStateOpen Then
        MsgBox "Connection Open"
    Else
        MsgBox "Connection Did Not Open"
        GoTo proc_exit
    End If
    
    'Open the view and get contents into recordset
    Set adoCmd = New ADODB.Command
    
    
    With adoCmd
        Set .ActiveConnection = adoConn
        .CommandType = adCmdText
        .CommandText = "SELECT SYSTEM.client_allergies_nondrug.PATID FROM SYSTEM.client_allergies_nondrug"
        .CommandTimeout = 120
        
        'Set adoRs = adoCmd.Execute
        Set adoRs = New ADODB.Recordset
        adoRs.Open adoCmd, , adOpenStatic, adLockReadOnly
    End With
    
    MsgBox "RS Count: " & adoRs.RecordCount & vbCrLf & "RS BOF: " & adoRs.BOF & vbCrLf & "RS EOF: " & adoRs.EOF
    
proc_exit:
    On Error Resume Next
    adoConn.Close
    Set adoConn = Nothing
    Set adoCmd = Nothing
    Set adoRs = Nothing
    Exit Function

proc_err:
    MsgBox Err.Number & ": " & Err.Description, vbCritical, "TestADO() Error"
    Resume proc_exit
End Function


ZurdoDev

Не публикуйте это как решение.

Doug Booth

Мое извинение. Я новичок на этом сайте и по ошибке разместил его не в том месте. Терпение, пожалуйста. Доброе слово в наши дни имеет большое значение.