无法在Access 2010中查询nVarChar(Max)字段

3
我曾经数百次地使用 Stack Overflow 作为资源,但这是我第一次发布一个问题以寻求帮助!
我在 SQL Server 2005 中有一个包含 4 个 nVarChar(Max) 字段的表格。我试图使用 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表中,然后从那里进行查询 - 这是对已经作为文本转换的解决方法的奇怪解决方法。
这里是否有什么我完全忽略的东西,或者我确实需要转换为文本并加载到本地表中?
谢谢任何帮助 - 它让我发疯!
附注:希望我给出了正确的详细信息 - 如果我漏掉了任何关键内容,请告诉我。
编辑:
天哪,我想我做到了/找到了问题...... 我将驱动程序更改为SQLSRV32(v6.01)-并且直接针对文本转换的字段似乎可以正常工作。 那么......为什么它会与旧驱动程序一起工作,但不建议使用较新的驱动程序(我读过的各种来源)作为要使用的驱动程序。 而且......与本机客户端相比,使用此客户端是否会有显着的缺点?
编辑2:
好吧,我在几台机器上尝试了几个驱动程序,在每种情况下都进行了文本转换和直接到VARCHAR MAX的测试。
[在我的Windows 7机器上w / SQLSMS 2008]
SQL Native Client 10.0-这个驱动程序的任何方法都不可靠 SQL Server 6.01-BOTH方法似乎可靠-尽管需要进一步测试
[在我们的生产服务器上w / SQLS 2005]
SQL Native Client(v2005.90)-根本不适用于varchar(max),但确实适用于文本转换 SQL Server(v2008.86)-BOTH方法似乎可靠-尽管需要进一步测试
这应该使部署变得有趣!

值得一试:停止使用 SELECT *无论如何都应该停止这样做),给你的列命名并将 NVARCHAR(MAX) 命名为最后一个。这可能是 我多年前写过的关于 TEXT/NTEXT 相似问题的延续 - Aaron Bertrand
谢谢Aaron - 只是为了举例子才使用了Select * - 平时不会这么懒!我尝试过调整字段顺序,但所有4个“参数”字段都是nvarchar(max)类型的 - 每个记录中填充不同的字段 - 有时只有其中一个,有时全部都有。(顺便说一句,有趣的文章,谢谢 - 我正在阅读它们) - aldredd
2个回答

0
我曾经遇到过同样的问题,通过将该字段转换为nvarchar(1000)来解决了它。如果1000个字符足够的话,这将是一个简单且兼容的解决方案。

0

这不是一个真正的答案,因为我没有测试过,但是...您在连接中使用了一个"DataTypeCompatibility=80"参数。据我所知,DataTypeCompatibility=80是指SQL Server 2000,那里还没有实现nvarchar(max)字段类型。


哦,好的发现,我刚才没看到。还有,你为什么要使用MARS? - Aaron Bertrand
如果我不包括数据类型,那么它根本不起作用 - 我得不到该字段的任何数据。MARS 可能不需要,我认为当我第一次接近解决问题时它在那里,但从未起作用。现在已经删除,但保留了数据类型。 - aldredd
你可以尝试使用 DataTypeCompatibility=90(适用于2005 SQL Server),甚至是100(适用于2008 SQL Server),具体取决于你的服务器。 - Philippe Grondier
谢谢Philippe,但这并没有改变行为,不过已经根据使用的数据库更新为“90”。 - aldredd
多年来,我一直通过SQLOLEDB连接(Provider=SQLOLEDB.1)从2005年(现在是2008年)的服务器请求这种类型的字段,没有任何问题。 - Philippe Grondier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接