【发布时间】: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 withTEXT/NTEXTI wrote about many years ago 的结转。 -
感谢 Aaron - 仅使用 Select * 作为示例 - 通常不会那么草率!我确实尝试过使用字段顺序,但是所有 4 个“参数”字段都是 nvarchar(max) - 每条记录上填充了不同的字段 - 有时只有其中 1 个,有时是全部。 (ps,有趣的文章,谢谢 - 阅读它们)
标签: sql-server ms-access nvarchar