Frage

Ich habe eine Funktion, die ich geschrieben habe, die ursprünglich sollte ein String-Feld nehmen und eine Excel-Tabelle mit den Werten zu füllen. Diese Werte kamen immer wieder auf null. Ich begann es wieder zu dem Re-Cord-Tracking und festgestellt, dass trotz der Abfrage gültig ist und ordnungsgemäß über das Access Query Analyzer läuft das Recordset leer war oder Felder hatte fehlt.

Um das Problem zu testen, habe ich einen Unter, in dem ich eine Abfrage erstellt, einen Re-Cord geöffnet, und dann durch die Werte ausgelagert (eine messagebox ausgeben). Die verwirrende Teil des Problems scheint sich um den „WHERE“ -Klausel der Abfrage zu drehen. Wenn ich nicht ein „WHERE“ -Klausel auf der Abfrage setzen, der Re-Cord immer Daten hat und die Werte für „Beschreibung“ sind normal.

Wenn ich put alles in für die WHERE-Klausel des Re-Cord zurück entweder ganz leer (rs.EOF = true) kommt oder das Feld Beschreibung ist völlig leer, wo die anderen Felder Werte aufweisen. Ich mag noch einmal betonen, dass, wenn ich die Abfrage debug.print, kann ich Kopieren / es in den Query Analyzer einfügen und einen gültigen und zurückgegebenen Werte erhalten, die ich erwarte.

Ich würde sicher etwas Hilfe mit dieser zu schätzen wissen. Vielen Dank!

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

EDIT: Jemand möchte, dass ich die debug.print der Abfrage schreiben. Hier ist sie:

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'

Ich habe versucht, doppelte und einfache Anführungszeichen ASCII-Zeichen und implizit.

Zum Beispiel:

"WHERE dbo_partmtl.mtlpartnum='3C16470'"

Ich habe sogar versucht, Ihren Vorschlag mit chr (39):

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

Beide geben einen Nullwert für die Beschreibung. Allerdings, wenn ich die Abfrage und fügen Sie ihn in der Access Query Analyzer debug.print, zeigt es ganz gut. Wieder (als Randnotiz), wenn ich eine LIKE-Anweisung in der WHERE-Klausel tut, wird es mir einen völlig leeren Re-Cord. Etwas ist wirklich wackelig hier.


Hier ist ein interessanter Leckerbissen. Die Tische sind mit einem SQL Server verknüpft. Wenn ich die Tabellen (Daten und Struktur) kopieren lokal arbeitete der ADO-Code oben einwandfrei. Wenn ich DAO verwenden funktioniert es gut. Ich habe diesen Code auf Windows XP, Access 2003 versucht, und verschiedene Versionen von ADO (2.5, 2.6, 2.8). ADO wird nicht funktionieren, wenn die Tabellen verknüpft sind.

Es gibt einige Fehler in ADO, die das Problem verursacht.


Absolut tue ich. Denken Sie daran, die DEBUG.PRINT Abfrage, die Sie sehen, läuft perfekt in der Query Analyzer. Es gibt folgende Möglichkeiten:

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

Allerdings ist die gleiche Abfrage gibt leere Werte für Beschreibung (alles andere ist gleich), wenn sie durch das Re-Cord (wegen „Null“ Wert messagebox Fehler) ausgeführt werden.


Ich habe versucht, das Feld „Beschreibung“ auf „testdep“ umbenannt hat, aber es ist immer noch leer. Der einzige Weg, es Daten zu machen angezeigt ist, um den WHERE Abschnitt der Abfrage zu entfernen. Ich fange dies ein Problem mit ADO zu glauben. Ich werde es mit DAO vielleicht umschreiben und zu sehen, welche Ergebnisse wir erhalten.

EDIT: Ich habe auch versucht, Verdichten und ein paar Mal zu reparieren. Keine Würfel.

War es hilfreich?

Lösung

Wenn ADO LIKE Suche verwenden, müssen% anstelle von *. Ich weiß, * Arbeiten in Access aber aus irgendeinem dummen Grund ADO wird nicht funktionieren, es sei denn, Sie% statt verwenden.

Ich hatte das gleiche Problem und lief accoss dieses Forum bei dem Versuch, es zu beheben. Ersetzen * 's mit%' s für mich gearbeitet.

Andere Tipps

Beschreibung ist ein reserviertes Wort - setzt einige [] Klammern um es in der SELECT-Anweisung

EDIT

Versuchen Sie, die Spalt etwas andere Beschreibung Benennung

Auch Sie sind sicher, dass Sie die gleichen Werte verwenden in der Klausel, wo - weil es ein LEFT JOIN ist so das Feld Beschreibung leer sein wird, wenn kein entsprechender Datensatz in dbo_part ist

Erneut bearbeiten

Wenn Sie lustige Ergebnisse bekommen - versuchen, eine Compact / Datenbank reparieren - Es ist möglicherweise beschädigt

Nun, was ich fürchtete, der Fall ist. Es funktioniert mit DAO aber nicht ADO.

Hier ist der Arbeits Code:

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

ich DAO nicht überall in dieser Datenbank verwenden und würde es vorziehen, nicht zu starten. Wohin gehen wir von hier aus?

Ich weiß, einige Zeit vergangen ist, seit diesem Thread gestartet, aber nur für den Fall, dass Sie sich fragen, ich habe einige neugierig Access 2003 fand heraus, und der Fehler möglicherweise auf 2007 übertragen (wie ich sehen kann, es hat).

Ich habe ein ähnliches Problem mit einer WHERE-Klausel habe, weil ich Datensätze aus einem Datumsfeld benötigt, die auch die Zeit enthielten, so dass die gesamten Feldinhalte wie # 6/14/2011 11.50.25 # (# aussehen würden ‚s für die Formatierung Zwecke hinzugefügt).

Die gleiche Problem wie oben, Abfrage funktioniert gut mit dem "WHERE ((tblTransactions.TransactionDate) Like '" & QueryDate & "*');" in der Abfrage-Entwurfsansicht, aber es wird in dem VBA-Code mithilfe von ADO nicht funktionieren.

Also ich zurückgegriffen mit "WHERE ((tblTransactions.TransactionDate) Like '" & QueryDate & "%%: %%: %%% M');" in dem VBA-Code, mit ADO und es funktioniert gut. Zeigt die Platte, die ich suchte, der Trick ist, nicht zu verwenden „*“ in der LIKE-Klausel; oder zumindest das war das Problem in meinem Fall.

Ich habe Klammer um das Wort „Beschreibung“ in der SELECT-Anweisung, aber es ist das Verhalten bleibt. Es funktioniert gut, solange ich nichts in der WHERE-Klausel setzen Sie. Ich habe festgestellt, wenn ich etwas in der where-Klausel setzen, ist die Beschreibung leer (obwohl sie in der Query Analyzer zeigt nach oben). Wenn ich eine LIKE-Anweisung in der WHERE-Klausel verwenden, wird die gesamte Cord-Set ist leer, aber es funktioniert immer noch richtig im Query Analyzer.

Letztendlich denke ich, es ist ein Problem mit ADO 2.8 auf Vista 64

Persönlich habe ich immer verwendet DAO in Access-Projekten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top