我曾经数百次地使用 Stack Overflow 作为资源,但这是我第一次发布一个问题以寻求帮助!
我在 SQL Server 2005 中有一个包含 4 个 nVarChar(Max) 字段的表格。我试图使用 ADO 2.8 从 Access (2010) VBA 模块中提取数据。我使用 SQL 驱动程序 SQLNCLI10 进行连接。
(我无法使用链接表,因为我最终要查询的是一个表值函数)
然后当我打印 / 使用记录集时,数据会混杂在同一记录的其他字段中,并添加一些晦涩的字符。
以下是 VBA 代码:(已尝试了各种其他方法,但效果相同)
现在,我最初在这里有一些运气 - 使用与上面相同的代码确实带回数据 - 但是当我在我的主要代码中使用此代码(它跳进并从其他过程中跳出);查询记录集的第一个结果后,似乎会清除其余的记录/字段,将它们设置为Null。我还尝试了在其余vba运行之间将每个字段的值设置为变量,然后再获取下一个记录,但这也没有帮助。
几乎感觉就像我需要将记录集转储到本地Access表中,然后从那里进行查询 - 这是对已经作为文本转换的解决方法的奇怪解决方法。
这里是否有什么我完全忽略的东西,或者我确实需要转换为文本并加载到本地表中?
谢谢任何帮助 - 它让我发疯!
附注:希望我给出了正确的详细信息 - 如果我漏掉了任何关键内容,请告诉我。
编辑:
天哪,我想我做到了/找到了问题...... 我将驱动程序更改为SQLSRV32(v6.01)-并且直接针对文本转换的字段似乎可以正常工作。 那么......为什么它会与旧驱动程序一起工作,但不建议使用较新的驱动程序(我读过的各种来源)作为要使用的驱动程序。 而且......与本机客户端相比,使用此客户端是否会有显着的缺点?
编辑2:
好吧,我在几台机器上尝试了几个驱动程序,在每种情况下都进行了文本转换和直接到VARCHAR MAX的测试。
[在我的Windows 7机器上w / SQLSMS 2008]
SQL Native Client 10.0-这个驱动程序的任何方法都不可靠 SQL Server 6.01-BOTH方法似乎可靠-尽管需要进一步测试
[在我们的生产服务器上w / SQLS 2005]
SQL Native Client(v2005.90)-根本不适用于varchar(max),但确实适用于文本转换 SQL Server(v2008.86)-BOTH方法似乎可靠-尽管需要进一步测试
这应该使部署变得有趣!
我在 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:
好吧,我在几台机器上尝试了几个驱动程序,在每种情况下都进行了文本转换和直接到VARCHAR MAX的测试。
[在我的Windows 7机器上w / SQLSMS 2008]
SQL Native Client 10.0-这个驱动程序的任何方法都不可靠 SQL Server 6.01-BOTH方法似乎可靠-尽管需要进一步测试
[在我们的生产服务器上w / SQLS 2005]
SQL Native Client(v2005.90)-根本不适用于varchar(max),但确实适用于文本转换 SQL Server(v2008.86)-BOTH方法似乎可靠-尽管需要进一步测试
这应该使部署变得有趣!
SELECT *
(无论如何都应该停止这样做),给你的列命名并将NVARCHAR(MAX)
命名为最后一个。这可能是 我多年前写过的关于TEXT/NTEXT
相似问题的延续。 - Aaron Bertrand