经典 ASP ADODB 结果已损坏
Classic ASP ADODB results corrupted
我正在将经典 ASP 应用程序迁移到较新的 SQL Server 数据库服务器。
新服务器是 Windows 2019 服务器(版本 10.0.17763)。我有一个 ADODB 连接(版本 10.0)到 SQL Server 2019 数据库(数据库是从旧版本迁移而来)。
似乎应用程序 运行s 几乎 完美,但在数十个工作正常的 ADODB 查询中有一个 returns 损坏了数据。
更新:事实证明,唯一受影响的列确实是 nvarchar(max) 列。因此,这是一个 duplicate of this question。我的原始问题的详细信息如下:
如果我运行存储过程在SQL Management Studio中,结果是完美的:
SELECT dbo.[Staff.Reports].[Report Title], replace(dbo.[Staff.Reports].[Description],char(34),'') as RepDesc
FROM dbo.[Staff.Reports] LEFT OUTER JOIN dbo.[Staff.Reports Permissions] ON dbo.[Staff.Reports].[Report ID] = dbo.[Staff.Reports Permissions].[Report ID]
WHERE dbo.[Staff.Reports Permissions].[Staff ID] = @StaffID
Returns:
Report Title
RepDesc
Achievements Admin
Update OAA, and other Achievements
AdRef By Engineers
AdRef By Engineers
Adref Status Count
Ad Campaign report by ref no.
等等
但是,当相同的查询是 运行 通过经典 ASP 代码时,使用 ADODB 连接,返回的数据已损坏:
Report Title
RepDesc
Achievements Admin
] 0
AdRef By Engineers
Adref Status Count
0
出于兴趣,描述栏是 nvarchar(max)
类型。我通过将其记录到文本输出文件来确定输出内容 - 这不是数据显示的问题。
输出相同数量的字符,但它们主要是空字符和控制字符。
我已尝试删除并重新创建查询,但对发生的情况一头雾水。
有人能帮忙吗?
感谢您的关注,AlwaysLearning。所有查询都是 运行 使用相同的 'GetRecordset' 函数,基本上是:
Set oConnection = CreateObject("ADODB.Connection")
oConnection.Open "Data Source=TheDatabase;UID=Fred;Password=" & strPassword
oConnection.CursorLocation = 3
Set CreateConnection = oConnection
Set objComm = Server.CreateObject("ADODB.Command")
objComm.ActiveConnection = CreateConnection
objComm.CommandType = adCmdStoredProc
objComm.CommandText = cQuery
objComm.CommandTimeout = 1800
For iThisParameter = 1 to UBound(aParameters)
Set objParam = objComm.CreateParameter("@par" & iThisParameter, adVarChar, adParamInput, 1024)
objComm.Parameters.Append objParam
objComm.Parameters("@par" & iThisParameter) = aParameters(iThisParameter)
Next
Set GetRecordset = objComm.Execute
您应该使用支持 ADO 的现代驱动程序连接到 SQL 服务器。
我正在将经典 ASP 应用程序迁移到较新的 SQL Server 数据库服务器。
新服务器是 Windows 2019 服务器(版本 10.0.17763)。我有一个 ADODB 连接(版本 10.0)到 SQL Server 2019 数据库(数据库是从旧版本迁移而来)。
似乎应用程序 运行s 几乎 完美,但在数十个工作正常的 ADODB 查询中有一个 returns 损坏了数据。
更新:事实证明,唯一受影响的列确实是 nvarchar(max) 列。因此,这是一个 duplicate of this question。我的原始问题的详细信息如下:
如果我运行存储过程在SQL Management Studio中,结果是完美的:
SELECT dbo.[Staff.Reports].[Report Title], replace(dbo.[Staff.Reports].[Description],char(34),'') as RepDesc
FROM dbo.[Staff.Reports] LEFT OUTER JOIN dbo.[Staff.Reports Permissions] ON dbo.[Staff.Reports].[Report ID] = dbo.[Staff.Reports Permissions].[Report ID]
WHERE dbo.[Staff.Reports Permissions].[Staff ID] = @StaffID
Returns:
Report Title | RepDesc |
---|---|
Achievements Admin | Update OAA, and other Achievements |
AdRef By Engineers | AdRef By Engineers |
Adref Status Count | Ad Campaign report by ref no. |
等等
但是,当相同的查询是 运行 通过经典 ASP 代码时,使用 ADODB 连接,返回的数据已损坏:
Report Title | RepDesc |
---|---|
Achievements Admin | ] 0 |
AdRef By Engineers | |
Adref Status Count | 0 |
出于兴趣,描述栏是 nvarchar(max)
类型。我通过将其记录到文本输出文件来确定输出内容 - 这不是数据显示的问题。
输出相同数量的字符,但它们主要是空字符和控制字符。
我已尝试删除并重新创建查询,但对发生的情况一头雾水。
有人能帮忙吗?
感谢您的关注,AlwaysLearning。所有查询都是 运行 使用相同的 'GetRecordset' 函数,基本上是:
Set oConnection = CreateObject("ADODB.Connection")
oConnection.Open "Data Source=TheDatabase;UID=Fred;Password=" & strPassword
oConnection.CursorLocation = 3
Set CreateConnection = oConnection
Set objComm = Server.CreateObject("ADODB.Command")
objComm.ActiveConnection = CreateConnection
objComm.CommandType = adCmdStoredProc
objComm.CommandText = cQuery
objComm.CommandTimeout = 1800
For iThisParameter = 1 to UBound(aParameters)
Set objParam = objComm.CreateParameter("@par" & iThisParameter, adVarChar, adParamInput, 1024)
objComm.Parameters.Append objParam
objComm.Parameters("@par" & iThisParameter) = aParameters(iThisParameter)
Next
Set GetRecordset = objComm.Execute
您应该使用支持 ADO 的现代驱动程序连接到 SQL 服务器。