私が書いた関数は、最初は文字列フィールドを取り、Excel スプレッドシートに値を入力することになっていました。これらの値は継続的に null になりました。レコードセットを追跡し始めたところ、クエリが有効で、Access クエリ アナライザーを介して適切に実行されているにもかかわらず、レコードセットが空であるか、フィールドが欠落していることがわかりました。
この問題をテストするために、クエリを作成し、レコードセットを開き、値をページング (メッセージ ボックスに出力) するサブを作成しました。問題の最も複雑な部分は、クエリの「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)
どちらも説明に null 値を返します。ただし、クエリを debug.print して Access クエリ アナライザーに貼り付けると、問題なく表示されます。繰り返しますが (補足として)、WHERE 句で LIKE ステートメントを実行すると、完全に空のレコードセットが作成されます。ここで何かが本当に不安定です。
ここに興味深いヒントがあります。テーブルは にリンクされていSQL Server
ます。テーブル (データと構造) をローカルにコピーすると、上記の ADO コードは問題なく動作しました。DAO を使用すると、正常に動作します。Windows XP
、Access 2003
、および のさまざまなバージョンでこのコードを試しましたADO (2.5, 2.6, 2.8)
。 ADO
テーブルがリンクされている場合は機能しません。
この問題の原因となる ADO の欠陥があります。
絶対にそうします。DEBUG.PRINT
表示されるクエリは、クエリ アナライザーで完全に実行されることを思い出してください。以下を返します。
ジョブ/サブ リビジョン 説明 数量あたり 36511C01 A 主電気エンクロージャ 1 36515C0V A ビジョンシステム 1 36529C01 主電気エンクロージャ 1
ただし、同じクエリをレコードセットに対して実行すると、Description に空の値が返されます (他はすべて同じです) ("Null" 値によるメッセージ ボックス エラー)。
「説明」フィールドの名前を「testdep」に変更しようとしましたが、まだ空です。データを表示する唯一の方法は、クエリの WHERE セクションを削除することです。これは ADO の問題だと思い始めています。たぶん、DAO で書き直して、どのような結果が得られるかを確認します。
編集: また、圧縮と修復を数回試みました。サイコロはありません。