SQL Server 文本列影响返回到经典 ASP 的结果

Posted

技术标签:

【中文标题】SQL Server 文本列影响返回到经典 ASP 的结果【英文标题】:SQL Server text column affects results returned to classic ASP 【发布时间】:2009-11-04 13:17:09 【问题描述】:

使用经典的 asp,我正在尝试像这样查询 SQL Server 数据库:

strSQL = "select column_1, column_2, column_3, column_4  from someview " &_
         "where RecordNo=" & i
set rs=conn.Execute(strSQL)

if not rs.eof then
    A = rs("column_1")
    B = rs("column_2")
    C = rs("column_3")
    D = rs("column_4")
end if

Column_3 为 NText 类型,其他列为 varchar 或 int(有时可能返回 4 列以上)但由于 where 子句,查询仅返回 1 条记录。

在 ASP 页面上,结果各不相同 - 有时会填充 A、B、D,有时不会 - 但视图中的所有列都包含数据(当我查询 SQL Server 时,我看到了预期的结果 - 所有列都包含数据) .如果我从 strSQL 中删除作为 NText 的 column_3 一切正常。

我过去曾在其他几个页面上看到过这种行为。如果我修改 ASP 以分别获取 column_3:

 strSQL = "select column_3 from someview where RecordNo=" & i

正确返回 NText 数据。

返回经典 ASP 的 SQL Server 记录集是否有最大记录长度?除了将 NTEXT 拆分为单独的查询之外,我还能做些什么吗?

编辑:我突然想到尝试更改连接字符串 - 受此 comment on a similar problem 的启发 - 连接是通过 SQL Server ODBC 驱动程序 (Driver=SQL Server;)。

【问题讨论】:

【参考方案1】:

我遇到过这个问题。 Microsoft 在其网站上的某处承认这一点。

如果你把 NText 列 last 放在 SELECT 列表中,你就可以访问它了。 但是,您的代码 读取 NText 值之后无法访问任何其他列。一旦你移动到记录集的下一行,你就可以了。

最好的解决方案是更改您的连接字符串,并使用更现代的东西。这以最好的方式解决了问题!

【讨论】:

这与对我有用的答案最接近 - 更改了连接字符串 (connectionstrings.com/sql-server#6) 并确保 NText 列位于选择列表中的最后一个,我不再看到问题了。谢谢 这非常接近我的错误,但是我不得不将 varchar(max) 更改为 varchar(4000),因为我知道我的数据不会超过 4000 个字符。【参考方案2】:

要避免使用记录集,试试这个:

返回 1 条记录:

arr = rs.Getrows 如果 IsArray(arr) 那么 A = arr(0) B = arr(1) C = arr(2) D = arr(3) 万一

更多记录:

aryList = rec.GetRows iCount = Ubound(aryList,2) 对于 i = 0 到 iCount A = aryList(0,i) B = aryList(1,i) C = aryList(2,i) D = aryList(3,i) ' 用 A,B,C,D 做某事 下一个

【讨论】:

【参考方案3】:

将 ntext 转换为 varchar 即可。

【讨论】:

【参考方案4】:

您正在将 unicode 数据(ntext 列)与非 unicode(varchar)混合。这可能是原因,因为 ASP 页面必须决定使用哪个页面。

尝试使用其中一种(将非 unicode 数据转换为 unicode 可能是更好的选择)。

【讨论】:

不是这样 - 我的问题中的错字 - 应该是 nvarchar【参考方案5】:

给那些使用旧代码的人的一个额外提示:

当使用 ADO/ASP 的记录集的列值为空白并且您只有一行数据时,您可以通过使用参数化的命令语句并将字符串值返回到变量来绕过此问题:

一些手写代码希望能解释我的意思:

' DB connection
Set objCon = Server.CreateObject("ADODB.Connection")
objCon.CursorLocation = adUseClient
objCon.Open pubDbConnString

' statement construction
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = objCon

cmd.CommandText = "SELECT ?=T.Column1, ?=T.Column2 From Table T WHERE ID=?"
cmd.CommandType = adCmdText
' add parameters
cmd.Parameters.Append cmd.CreateParameter("@column1Data", adVarChar, adParamOutput, 8000)
cmd.Parameters.Append cmd.CreateParameter("@column2Data", adTinyInt, adParamOutput)
cmd.Parameters.Append cmd.CreateParameter("@id", adBigInt, adParamInput)
cmd.Parameters("@id").value = 1

set objRS = cmd.Execute

@column1Data 将包含大字符串。 objRS 实际上不会有任何记录,因此请注意这一点。

理论上,这也应该适用于具有相同结果的命名参数,但我没有对此进行测试。

【讨论】:

以上是关于SQL Server 文本列影响返回到经典 ASP 的结果的主要内容,如果未能解决你的问题,请参考以下文章

使用经典 ASP 检查 SQL Server 表中“标记”短语的字符串

经典 ASP - 使用 Windows 身份验证的 SQL Server 2008 连接字符串

对于 asp.net mvc Web 应用程序,将文本文件存储到 Sql Server 数据库中的最佳方法是啥?

SQL Server返回插入数据的ID和受影响的行数

SQL Server返回插入数据的ID和受影响的行数

sql server“键列信息不足或不正确。更新影响到多行”