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) では機能します - 両方の方法が確実に機能するように見えます - さらにテストが必要です
これは展開を面白くするはずです!