Access 2007 VBA Query показывает данные в Query Analyzer, но не в VBA Coded Recordset - PullRequest
1 голос
/ 31 октября 2008

У меня есть функция, которую я написал, которая первоначально должна была принимать строковое поле и заполнять таблицу Excel значениями. Эти ценности постоянно обнулялись. Я начал отслеживать его обратно к набору записей и обнаружил, что, несмотря на то, что запрос был действительным и правильно выполнялся через анализатор запросов Access, набор записей был пуст или имел пропущенные поля.

Чтобы проверить проблему, я создал подпрограмму, в которой создал запрос, открыл набор записей, а затем пролистал значения (вывел их в окно сообщения). Кажется, что самая сложная часть проблемы связана с предложением WHERE. Если я не добавлю в запрос предложение «WHERE», то в наборе записей всегда будут данные, а значения «DESCRIPTION» нормальные.

Если я добавлю что-нибудь для предложения WHERE, набор записей вернется либо полностью пустым (rs.EOF = true), либо поле Описание будет полностью пустым, если другие поля имеют значения. Я хочу еще раз подчеркнуть, что если я отлаживаю отпечаток запроса, я могу скопировать / вставить его в анализатор запросов и получить действительные и возвращаемые значения, которые я ожидаю.

Я бы очень признателен за помощь. Спасибо!

Private Sub NewTest()

'  Dimension Variables
'----------------------------------------------------------
Dim rsNewTest As ADODB.Recordset
Dim sqlNewTest As String
Dim Counter As Integer

'  Set variables
'----------------------------------------------------------
Set rsNewTest = New ADODB.Recordset

sqlNewTest = "SELECT dbo_partmtl.partnum as [Job/Sub], dbo_partmtl.revisionnum as Rev, " & _
                "dbo_part.partdescription as Description, dbo_partmtl.qtyper as [Qty Per] " & _
            "FROM dbo_partmtl " & _
            "LEFT JOIN dbo_part ON dbo_partmtl.partnum = dbo_part.partnum " & _
            "WHERE dbo_partmtl.mtlpartnum=" & Chr(34) & "3C16470" & Chr(34)

'  Open recordset
rsNewTest.Open sqlNewTest, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

    Do Until rsNewTest.EOF

        For Counter = 0 To rsNewTest.Fields.Count - 1
            MsgBox rsNewTest.Fields(Counter).Name
        Next

        MsgBox rsNewTest.Fields("Description")

        rsNewTest.MoveNext

    Loop

'  close the recordset

rsNewTest.Close
Set rsNewTest = Nothing

End Sub

РЕДАКТИРОВАТЬ: Кто-то просил, чтобы я опубликовал DEBUG.PRINT запроса. Вот оно:

SELECT dbo_partmtl.partnum as [Job/Sub], dbo_partmtl.revisionnum as Rev, dbo_part.partdescription as [Description], dbo_partmtl.qtyper as [Qty Per] FROM dbo_partmtl LEFT JOIN dbo_part ON dbo_partmtl.partnum = dbo_part.partnum WHERE dbo_partmtl.mtlpartnum='3C16470'

Я пробовал двойные и одинарные кавычки, используя символы ASCII и неявно.

Например:

"WHERE dbo_partmtl.mtlpartnum='3C16470'"

Я даже попробовал ваше предложение с помощью chr (39):

"WHERE dbo_partmtl.mtlpartnum=" & Chr(39) & "3C16470" & Chr(39)

Оба возвращают нулевое значение для описания. Тем не менее, если я отладить.печатать запрос и вставить его в анализатор запросов Access, он отображается просто отлично. Опять же (как примечание), если я сделаю оператор LIKE в предложении WHERE, он даст мне полностью пустой набор записей. Здесь что-то действительно шаткое.


Вот интересный лакомый кусочек. Таблицы связаны с SQL Server. Если я копирую таблицы (данные и структуру) локально, приведенный выше код ADO работал безупречно. Если я использую DAO, он работает нормально. Я пробовал этот код на Windows XP, Access 2003 и различных версиях ADO (2.5, 2.6, 2.8). ADO не будет работать, если таблицы связаны.

В ADO есть некоторый недостаток, который вызывает проблему.


Совершенно верно. Помните, что DEBUG.PRINT запрос, который вы видите, прекрасно работает в анализаторе запросов. Возвращает следующее:

Job/Sub     Rev         Description                     Qty Per
36511C01     A          MAIN ELECTRICAL ENCLOSURE       1
36515C0V     A          VISION SYSTEM                   1
36529C01     A          MAIN ELECTRICAL ENCLOSURE       1

Однако тот же запрос возвращает пустые значения для Description (все остальное тоже самое) при запуске через набор записей (ошибки в окне сообщения из-за значения "Null").


Я попытался переименовать поле "description" в "testdep", но оно все еще пусто. Единственный способ заставить его отображать данные - это удалить раздел WHERE запроса. Я начинаю верить, что это проблема с ADO. Может быть, я перепишу это с DAO и посмотрю, какие результаты я получу.

РЕДАКТИРОВАТЬ: Я также пытался сжимать и восстанавливать пару раз. Без кубиков.

Ответы [ 6 ]

3 голосов
/ 14 января 2009

При использовании ADO LIKE для поиска необходимо использовать% вместо *. Я знаю, * работает в Access, но по какой-то глупой причине ADO не будет работать, если вы не используете% вместо этого.

У меня возникла та же проблема, и я пытался ее исправить. Замена * на% сработала для меня.

1 голос
/ 14 июня 2011

Я знаю, что прошло некоторое время с тех пор, как начался этот поток, но на случай, если вам интересно, я обнаружил кое-что любопытное в Access 2003, и ошибка могла быть перенесена на 2007 год (насколько я вижу, что это так).

У меня была похожая проблема с предложением WHERE, потому что мне нужны были записи из поля даты, которое также содержало время, поэтому все содержимое поля выглядело бы как # 6/14/2011 11:50:25 AM # (# добавлено для форматирования).

Та же проблема, что и выше, запрос отлично работает с "WHERE ((tblTransactions.TransactionDate) Like '" & QueryDate & "*');" в представлении конструктора запросов, но он не будет работать в коде VBA с использованием ADO.

Поэтому я прибег к использованию "WHERE ((tblTransactions.TransactionDate) Like '" & QueryDate & "%%: %%: %%% M');" в коде VBA, с ADO, и он работает просто отлично. Отображает искомую запись, уловка не в том, чтобы использовать "*" в предложении Like; или, по крайней мере, это была проблема в моем случае.

1 голос
/ 31 октября 2008

Ну, чего я боялся, так и есть. Он работает отлично с DAO, но не ADO.

Вот рабочий код:

Private Sub AltTest()

'  Dimension Variables
'----------------------------------------------------------
Dim rsNewTest As DAO.Recordset
Dim dbl As DAO.Database

Dim sqlNewTest As String
Dim Counter As Integer

'  Set variables
'----------------------------------------------------------

sqlNewTest = "SELECT dbo_partmtl.partnum as [Job/Sub], dbo_partmtl.revisionnum as Rev, " & _
                "dbo_part.partdescription as [TestDep], dbo_partmtl.qtyper as [Qty Per] " & _
            "FROM dbo_partmtl " & _
            "LEFT JOIN dbo_part ON dbo_partmtl.partnum = dbo_part.partnum " & _
            "WHERE dbo_partmtl.mtlpartnum=" & Chr(39) & "3C16470" & Chr(39)


Debug.Print "sqlNewTest: " & sqlNewTest
Set dbl = CurrentDb()
Set rsNewTest = dbl.OpenRecordset(sqlNewTest, dbOpenDynaset)


' rsnewtest.OpenRecordset

    Do Until rsNewTest.EOF

        For Counter = 0 To rsNewTest.Fields.Count - 1
            MsgBox rsNewTest.Fields(Counter).Name
        Next

        MsgBox rsNewTest.Fields("TestDep")

        rsNewTest.MoveNext

    Loop

'  close the recordset

dbl.Close
Set rsNewTest = Nothing

End Sub

Я нигде не использую DAO в этой базе данных и предпочел бы не запускать. Куда мы идем отсюда?

1 голос
/ 31 октября 2008

Описание - зарезервированное слово - заключите в него несколько [] скобок в операторе SELECT

EDIT

Попробуйте назвать что-то в столбце, кроме Описание

Также вы уверены, что используете те же значения в предложении where - потому что это левое соединение, поэтому поле Description будет пустым, если в dbo_part

нет соответствующей записи

ИЗМЕНИТЬ СНОВА

Если вы получаете забавные результаты - попробуйте Компакт / Ремонт базы данных - она ​​может быть повреждена

0 голосов
/ 31 октября 2008

В конечном счете, я думаю, что это проблема с запуском ADO 2.8 в Vista 64

Лично я всегда использовал DAO в проектах Access.

0 голосов
/ 31 октября 2008

Я поставил скобки вокруг слова «Описание» в операторе SELECT, но его поведение остается. Это работает нормально, пока я не помещаю ничего в предложение WHERE. Я обнаружил, что если я добавлю что-либо в предложение where, описание будет пустым (несмотря на то, что оно отображается в анализаторе запросов). Если я использую инструкцию LIKE в предложении WHERE, весь набор записей будет пустым, но он все равно будет корректно работать в Query Analyzer.

...