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

时间:2013-03-06 14:39:20

标签: sql-server ms-access nvarchar

将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表中,并从那里进行查询 - 这是一个已经解决方法(通过转换为文本)的集市解决方法。

我有一些我在这里完全遗漏的东西,或者我确实需要将其作为文本转换并加载到本地表中?

感谢您的帮助 - 这让我很生气!

PS。希望我已经给出了正确的详细信息/信息 - 如果我遗漏了任何关键信息,请告诉我。

编辑:

Yikes,我想我已经完成了/发现了这个问题...... 我将驱动程序更改为SQLSRV32(v6.01) - 并且似乎可以直接对文本转换字段起作用。 那么......为什么它会与较旧的驱动程序一起使用,而不是使用较新的“推荐”(通过我阅读的各种来源)。 并且......在本机客户端上使用它会有明显的缺点吗?

编辑2:

好的,我在几台机器上尝试过几个驱动程序,分别是TEXT CASTING和Directly到VARCHAR MAX ..

[在我的Windows 7机器上使用SQLSMS 2008]

SQL Native Client 10.0 - 这两种方法都不能可靠地使用此驱动程序 SQL Server 6.01 - BOTH方法似乎可靠地运行 - 需要进一步测试

[在我们的生产服务器上使用SQLS 2005]

SQL Native Client(v2005.90) - 使用varchar(max)完全不起作用,但是DOES可以使用文本转换 SQL Server(v2008.86) - 两种方法似乎都可靠运行 - 需要进一步测试

这应该让部署变得有趣!

2 个答案:

答案 0 :(得分:0)

这不是一个真正的答案,因为我没有测试它,但是......你在连接中使用了“DataTypeCompatibility = 80”参数。据我所知,DataTypeCompatibility = 80指的是SQL Server 2000,其中nvarchar(max)字段类型仍未实现。

答案 1 :(得分:0)

我有同样的问题,通过将字段转换为nvarchar(1000)来解决它。如果1000个字符足够,那将是一个简单,兼容的问题解决方案。