3

Stack Overflow をリソースとして何百回も使用してきましたが、質問を投稿するのは初めてです。

4 つの nVarChar(Max) フィールドを含む SQL Server 2005 のテーブルがあります。ADO 2.8 を使用して Access (2010) VBA モジュールからデータを取得しようとしています SQL ドライバー SQLNCLI10 を使用して接続しています

(最終的に照会する「テーブル」はテーブル値関数であるため、リンクされたテーブルは使用できません)

次に、レコードセットを印刷/使用すると、データがごちゃごちゃになり、同じレコード内の他のフィールドと連結されます-あいまいな文字がたくさん投げ込まれます.

VBA:(他のさまざまな方法が同じ結果で試行されました)

Sub TestWithoutCasting()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim i As Integer

cn.Open "Data Source=ART;DataTypeCompatibility=80;MARS Connection=True;"

Set rs = cn.Execute("SELECT * FROM JobDetail WHERE JobID = 2558 ORDER BY SeqNo ASC")

Do While Not rs.EOF

    For i = 1 To rs.Fields.Count
        Debug.Print rs.Fields(i).Name & ": " & rs.Fields(i).Value
    Next i

    rs.MoveNext
Loop

End Sub

出力例:

SeqNo: 1
CommandID: 2
Parameter1:     2 Daily Report    é [& some other chars not showing on here]
Parameter2: [Null]
Parameter3: [Null]
Parameter4: [Null]
Description: Daily Report
Active: False

期待される出力:

SeqNo: 1
CommandID: 2
Parameter1: SELECT  Day_Number  ,Day_Text  ,Channel_Group_ID [...etc]
Parameter2: [Null]
Parameter3: [Null]
Parameter4: [Null]
Description: Daily Report
Active: False

したがって、正しいデータではなく、他のフィールドからデータの一部を取得しています (この場合は SQL ステートメントです)。

次に、ソースで nvarchar(max) フィールドをテキストとしてキャストしてみました

作成されたビュー:

    CREATE VIEW TestWithCast 
    AS
    SELECT jd.JobID, jd.SeqNo, jd.CommandID
    ,cast(jd.Parameter1 as text) as Parameter1
    ,cast(jd.Parameter2 as text) as Parameter2
    ,cast(jd.Parameter3 as text) as Parameter3
    ,cast(jd.Parameter4 as text) as Parameter4
    ,jd.[Description]
    ,jd.Active

    FROM JobDetail jd

さて、最初はここで運が良かった-上記と同じコードを使用するとデータが返される-しかし、このコードをメインコードで使用すると(他の手順に出入りする); レコードセットの最初の結果を照会するとすぐに、残りのレコード/フィールドが消去され、Null に設定されているように見えます。また、次のレコードを取得する前に残りの vba が実行されている間に、各フィールドの値を変数に設定しようとしましたが、これも役に立ちません。

レコードセットをローカルの Access テーブルにダンプし、そこからクエリを実行する必要があるように感じます。これは、(テキストとしてキャストすることにより) 既に回避策になっているものに対するバザールの回避策です。

ここで完全に欠けているものがありますか、それともテキストとしてキャストしてローカルテーブルにロードする必要がありますか?

助けてくれてありがとう - それは私を怒らせています!

ps。適切なレベルの詳細/情報を提供できたことを願っています。何か重要な情報を見逃していた場合はお知らせください。

編集:

ええ、私はそれをやった/問題を見つけたと思います...ドライバーをSQLSRV32(v6.01)に変更しました-テキストキャストフィールドに対して直接正常に動作するようです。では、なぜ古いドライバーで動作するのに、使用するドライバーとして新しい「推奨」(私が読んださまざまな情報源による) では動作しないのでしょうか。そして...ネイティブクライアントでこれを使用すると、重大な欠点がありますか?

編集2:

わかりました、私はいくつかのマシンでいくつかのドライバーを試しました。それぞれのケースで、TEXT CASTING と Directly to VARCHAR MAX の両方で..

[SQLSMS 2008 を搭載した Windows 7 マシンで]

SQL Native Client 10.0 - このドライバーではどちらの方法も確実に機能しない SQL Server 6.01 - 両方の方法が確実に機能するように見える - さらなるテストが必要

[SQLS 2005 を搭載した本番サーバーで]

SQL Native Client (v2005.90) - varchar(max) ではまったく機能しませんが、テキスト キャスト SQL Server (v2008.86) では機能します - 両方の方法が確実に機能するように見えます - さらにテストが必要です

これは展開を面白くするはずです!

4

2 に答える 2

0

テストしていないため、本当の答えではありませんが...接続で「DataTypeCompatibility = 80」パラメーターを使用しています。私の知る限り、DataTypeCompatibility=80 は、nvarchar(max) フィールド タイプがまだ実装されていない SQL Server 2000 を指します。

于 2013-03-06T15:22:26.060 に答える