У меня есть функция, которую я написал, которая первоначально должна была принимать строковое поле и заполнять таблицу 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 и посмотрю, какие результаты я получу.
РЕДАКТИРОВАТЬ: Я также пытался сжимать и восстанавливать пару раз. Без кубиков.