【问题标题】:Unable to query nVarChar(Max) field in Access 2010无法在 Access 2010 中查询 nVarChar(Max) 字段
【发布时间】:2013-02-21 09:53:02
【问题描述】:

已经数百次使用 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。希望我提供了正确的详细信息/信息 - 如果我遗漏了任何关键信息,请告诉我。

编辑:

哎呀,我想我已经做到了/找到了问题... 我将驱动程序更改为 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) - 两种方法似乎都可以可靠地工作 - 不过需要进一步测试

这应该会让部署变得有趣!

【问题讨论】:

  • 值得一试:停止使用SELECT * (you should stop doing that anyway),为您的列命名并最后命名NVARCHAR(MAX)。这可能是来自similar problems with TEXT/NTEXT I wrote about many years ago 的结转。
  • 感谢 Aaron - 仅使用 Select * 作为示例 - 通常不会那么草率!我确实尝试过使用字段顺序,但是所有 4 个“参数”字段都是 nvarchar(max) - 每条记录上填充了不同的字段 - 有时只有其中 1 个,有时是全部。 (ps,有趣的文章,谢谢 - 阅读它们)

标签: sql-server ms-access nvarchar


【解决方案1】:

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

【讨论】:

  • 哦,很好,请直接阅读。还有你为什么要使用 MARS?
  • 如果我不包含 DataType,它根本不起作用 - 我没有得到该字段的数据。 MARS prob 不需要,我认为当我第一次接近工作时它就在那里,并且从未起飞。现在已删除,但保留了 DataType
  • 您可以尝试 DataTypeCompatibility=90(对于 2005 SQL Server),甚至可以尝试 100(对于 2008 SQL Server),具体取决于您的服务器。
  • 感谢 Philippe,它没有改变行为,但已根据正在使用的数据库更新为“90”​​。
  • 多年来,我一直通过 SQLOLEDB 连接 (Provider=SQLOLEDB.1) 从 2005 年(现在是 2008 年)服务器请求此类字段,没有任何问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2016-08-23
    • 2015-09-16
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多