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:

好的,我已经在几台机器上尝试了一些驱动程序,在每种情况下都使用 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) 一起使用 - 两种方法似乎都可以可靠地工作 - 虽然需要进一步测试

这应该使部署变得有趣!

4

2 回答 2

0

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

于 2013-05-29T15:29:50.177 回答
0

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

于 2013-03-06T15:22:26.060 回答