私が書いた関数は、最初は文字列フィールドを取り、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 で書き直して、どのような結果が得られるかを確認します。
編集: また、圧縮と修復を数回試みました。サイコロはありません。