2008-10-31 37 views
1

我有一個函數,我已經寫了,最初應該採取一個字符串字段和填充Excel值的電子表格。這些價值觀一直是空的。我開始將它追溯到記錄集,發現儘管查詢是有效的並且通過Access查詢分析器正確運行,但記錄集爲空或缺少字段。訪問2007 VBA查詢顯示查詢分析器中的數據,但不是在VBA編碼記錄集

爲了測試這個問題,我創建了一個子程序,在其中創建了一個查詢,打開了一個記錄集,然後通過值(將它們輸出到一個消息箱)進行分頁。問題中最令人困惑的部分似乎圍繞着查詢的「WHERE」子句。如果我沒有在查詢中放置「WHERE」子句,記錄集總是有數據,「DESCRIPTION」的值是正常的。

如果我把什麼在WHERE子句記錄回來要麼完全空(rs.EOF = true)或說明字段是完全空白的地方等領域都有值。我想再次強調,如果我debug.print查詢,我可以複製/粘貼到查詢分析器,並獲得我期望的有效和返回的值。

我一定會很感激這方面的幫助。謝謝!

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) 

無論對於描述返回空值。但是,如果我debug.print查詢並將其粘貼到Access查詢分析器,它顯示得很好。再次(作爲一個附註),如果我在WHERE子句中使用LIKE語句,它會給我一個完全空的記錄集。這裏真的很奇怪。


這是一個有趣的消息。表格鏈接到SQL Server。如果我在本地複製表(數據和結構),上面的ADO代碼完美無缺地工作。如果我使用DAO,它工作正常。我已經在Windows XPAccess 2003ADO (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 

然而,同樣的查詢時,通過記錄運行(因爲「空」值MessageBox的錯誤)的說明返回空值(一切是一樣的)。


我試着將「description」字段重命名爲「testdep」,但它仍然是空的。使其顯示數據的唯一方法是刪除查詢的WHERE部分。我開始相信這是ADO的問題。也許我會用DAO重寫它,看看我得到了什麼結果。

編輯:我也嘗試壓縮和修復幾次。沒有骰子。

+0

說明字段始終爲空,但其他字段可以有數據(取決於where子句)如果我使用」LIKE「 where子句,它返回一個完全空的記錄集。一如往常,查詢分析器返回正確的數據。 難道這是我使用ADO的問題嗎? – 2008-10-31 15:33:22

回答

3

當使用ADO LIKE搜索必須改用%的*。我知道*在Access中工作,但出於某種愚蠢的原因,除非您使用%,否則ADO將無法工作。

我有同樣的問題,跑accoss這個論壇,同時試圖修復它。用%代替*代表我的工作。

1

說明是保留字 - 把一些括號[]在它周圍的SELECT語句

編輯

嘗試命名列的東西,除了說明

而且你確定你使用的是相同的值在where子句中 - 因爲它是左連接,因此如果dbo_part中沒有相應的記錄,說明字段將爲空

編輯再次

如果你得到有趣的結果 - 嘗試一個壓縮/修復數據庫 - 它可能會損壞

0

我在SELECT語句中的「描述」一詞放在括號內,但它的行爲仍然存在。只要我不把任何東西放在WHERE子句中,它就可以正常工作。我發現如果我在where子句中添加任何內容,說明是空白的(儘管在查詢分析器中顯示)。如果我在WHERE子句中使用LIKE語句,整個記錄集都是空的,但它仍然可以在查詢分析器中正常工作。

+0

嘗試命名該列除了說明 – 2008-10-31 15:44:15

+0

您是否確定在where子句中使用相同的值 - 因爲它是左連接,所以如果dbo_part中沒有相應的記錄,說明字段將爲空 – 2008-10-31 15:49:25

+0

我嘗試了重命名該列。我發佈了debug.print,以便您可以看到輸入查詢分析器的確切查詢。 – 2008-10-31 16:30:39

1

那麼,我擔心是這種情況。它適用於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 

末次

我並不在此數據庫中的任何地方使用DAO,寧願不啓動。我們從哪裏出發?

0

最後,我認爲這是在Access項目在Vista上運行的64 ADO 2.8

我個人一直使用DAO的問題。

1

我知道,因爲這個線程開始一段時間已經過去了,但以防萬一你想知道,我已經找到了一些好奇Access 2003和錯誤可能會延續到2007年(我可以看到它有) 。

我有一個與WHERE子句類似的問題,因爲我需要的日期字段也包含時間的記錄,所以整個字段的內容看起來像#6/14/2011 11:50:25 AM#(爲了格式化目的添加了#)。

相同的問題上面,查詢工作正常的「WHERE((tblTransactions。TransactionDate)就像「」 & QueryDate &「*「);」在查詢設計視圖,但它不會在VBA代碼中使用ADO工作

於是我使出使用」WHERE((tblTransactions.TransactionDate)就像''& QueryDate &「%%:%%:%%%M');」在VBA代碼中,使用ADO,它工作的很好,顯示我正在查找的記錄,訣竅是不使用「* 「在Like子句中;或者至少在我的情況下是這個問題