已经使用 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) 一起使用 - 两种方法似乎都可以可靠地工作 - 虽然需要进一步测试
这应该使部署变得有趣!