将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。希望我已经给出了正确的详细信息/信息 - 如果我遗漏了任何关键信息,请告诉我。
编辑:
Yikes,我想我已经完成了/发现了这个问题...... 我将驱动程序更改为SQLSRV32(v6.01) - 并且似乎可以直接对文本转换字段起作用。 那么......为什么它会与较旧的驱动程序一起使用,而不是使用较新的“推荐”(通过我阅读的各种来源)。 并且......在本机客户端上使用它会有明显的缺点吗?
编辑2:
好的,我在几台机器上尝试过几个驱动程序,分别是TEXT CASTING和Directly到VARCHAR MAX ..
[在我的Windows 7机器上使用SQLSMS 2008]
SQL Native Client 10.0 - 这两种方法都不能可靠地使用此驱动程序 SQL Server 6.01 - BOTH方法似乎可靠地运行 - 需要进一步测试
[在我们的生产服务器上使用SQLS 2005]
SQL Native Client(v2005.90) - 使用varchar(max)完全不起作用,但是DOES可以使用文本转换 SQL Server(v2008.86) - 两种方法似乎都可靠运行 - 需要进一步测试
这应该让部署变得有趣!
答案 0 :(得分:0)
这不是一个真正的答案,因为我没有测试它,但是......你在连接中使用了“DataTypeCompatibility = 80”参数。据我所知,DataTypeCompatibility = 80指的是SQL Server 2000,其中nvarchar(max)字段类型仍未实现。
答案 1 :(得分:0)
我有同样的问题,通过将字段转换为nvarchar(1000)来解决它。如果1000个字符足够,那将是一个简单,兼容的问题解决方案。