2013-03-06 92 views
2

已經使用Stack Overflow作爲資源數百次,但我第一次發佈一個問題尋求幫助!無法查詢Access 2010中的nVarChar(Max)字段

我在SQL Server 2005中有一個包含4個nVarChar(Max)字段的表。 我試圖使用ADO 2.8 我使用的是SQL司機SQLNCLI10

(我不能使用鏈接表連接的訪問​​(2010)VBA模塊中拔出的數據,作爲「表」我最終將被查詢是一個表值函數)

當我然後打印/使用記錄,該數據是越來越混亂,並與在相同的記錄等領域級聯 - 與一堆在拋出晦澀字符

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)字段作爲文本

查看Creat編輯:

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鑄造和直接到VARCHAR MAX ..在我的Windows 7機器

[ W/SQLSMS 2008]

SQL Native Client的10.0 - 這兩種方法都與此驅動程序 的SQL Server 6.01可靠地工作 - 這兩種方法似乎可靠地工作 - 進一步的測試需要,雖然

[我們的生產服務器瓦特/ SQL S 2005]

SQL Native Client(v2005.90) - 根本無法使用varchar(max),但可以使用文本轉換 SQL Server(v2008.86) - 這兩種方法似乎可以可靠地工作 - 進一步測試需要儘管

這應該使部署有趣!

+0

值得一試:停止使用'SELECT *'([你應該停止這樣做](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/bad-habits-to-kick -use-select-omitting-the-column-list.aspx)),爲你的列命名並且命名最後的'NVARCHAR(MAX)'。這可能會導致[與我多年前寫的TEXT/NTEXT類似的問題](http://databases.aspfaq.com/database/how-do-i-deal-with-memo-text-hyperlink-和貨幣columns.html)。 – 2013-03-06 14:42:43

+0

謝謝Aaron - 只用Select *作爲例子 - 通常不會馬虎!我曾嘗試過使用字段順序,但所有4個'Parameter'字段都是nvarchar(max) - 每個記錄中都會填充不同的字符 - 有時候只有其中的一個,有時全部。 (ps,有趣的文章,謝謝 - 閱讀雖然他們) – aldredd 2013-03-06 15:03:12

回答

0

這不是一個真正的答案,因爲我沒有測試它,但是...您在連接中使用了「DataTypeCompatibility = 80」參數。據我所知,DataTypeCompatibility = 80是指SQL Server 2000,其中nvarchar(max)字段類型仍未實現。

+0

噢,好趕上,閱讀正確的過去。另外你爲什麼使用MARS? – 2013-03-06 15:24:08

+0

如果我不包含DataType,它根本不起作用 - 我沒有收到該字段的數據。 MARS概率不需要,我認爲當我第一次接近工作時它就在那裏,並且從未起飛。現在已刪除,但保留DataType – aldredd 2013-03-06 15:34:16

+0

您可以嘗試DataTypeCompatibility = 90(對於2005 SQL Server),或者甚至100(對於2008 SQL Server),具體取決於您的服務器。 – 2013-03-06 15:39:38

0

我有同樣的問題,通過將字段轉換爲nvarchar(1000)來解決它。如果1000個字符就足夠了,對於您的問題將是一個簡單,兼容的解決方案。