1

私が書いた関数は、最初は文字列フィールドを取り、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 XPAccess 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 で書き直して、どのような結果が得られるかを確認します。

編集: また、圧縮と修復を数回試みました。サイコロはありません。

4

6 に答える 6

3

ADO LIKE 検索を使用する場合は、* の代わりに % を使用する必要があります。* は Access で動作することはわかっていますが、代わりに % を使用しない限り、愚かな理由で ADO が動作しません。

私は同じ問題を抱えており、修正しようとしているときにこのフォーラムにアクセスしました。* を % に置き換えるとうまくいきました。

于 2009-01-13T23:04:32.413 に答える
1

このスレッドが開始されてからしばらく経っていることは承知していますが、参考までに、Access 2003 に関するいくつかの興味深い情報を見つけたので、バグが 2007 に持ち越されている可能性があります (私が確認したように)。

時間を含む日付フィールドからのレコードが必要だったため、WHERE 句で同様の問題が発生したため、フィールド全体の内容は #6/14/2011 11:50:25 AM# のようになります (# が追加されます)書式設定のため)。

上記と同じ問題、クエリは "WHERE ((tblTransactions.TransactionDate) Like '" & QueryDate & "*');" で正常に機能します。ただし、ADO を使用する VBA コードでは機能しません。

そこで、「WHERE ((tblTransactions.TransactionDate) Like '" & QueryDate & " %%:%%:%% %M');」を使用することにしました。VBAコードで、ADOを使用すると問題なく動作します。探していたレコードが表示されます。秘訣は、Like 句で "*" を使用しないことです。または少なくともそれが私の場合の問題でした。

于 2011-06-14T19:08:18.067 に答える
1

説明は予約語です - SELECT ステートメントで [] 括弧で囲みます

編集

列に説明以外の名前を付けてみてください

また、where 句で同じ値を使用していることを確認していますか? これは左結合であるため、dbo_part に対応するレコードがない場合、説明フィールドは空白になります。

もう一度編集

おかしな結果が得られた場合は、データベースの圧縮/修復を試してください。破損している可能性があります。

于 2008-10-31T15:34:48.887 に答える
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 を使用していないので、開始したくありません。ここからどこにいきますか?

于 2008-10-31T16:56:10.673 に答える
0

SELECT ステートメントで「説明」という単語を括弧で囲みましたが、その動作はそのままです。WHERE 句に何も入れない限り、問題なく動作します。where句に何かを入れると、説明が空白になることがわかりました(クエリアナライザーに表示されているにもかかわらず)。WHERE 句で LIKE ステートメントを使用すると、レコードセット全体が空になりますが、クエリ アナライザーでは正常に機能します。

于 2008-10-31T15:42:16.143 に答える
0

最終的には、Vista 64 で ADO 2.8 を実行する際の問題だと思います。

個人的には、Access プロジェクトでは常に DAO を使用してきました。

于 2008-10-31T19:20:16.343 に答える