【问题标题】:Strange problem with nvarchar(max) fields and Classic ASPnvarchar(max) 字段和经典 ASP 的奇怪问题
【发布时间】:2011-03-07 22:14:42
【问题描述】:

我正在使用 IIS7Windows 2008 服务器上运行经典 ASP (VBScript) 网站并访问 SQL Server 2008 数据库,我看到了一些奇怪的行为,这些行为似乎特定于 nvarchar(max) 类型的字段。

我有一段简单的代码循环一些查询结果并尝试打印出标题字段两次

rs.open "SELECT * FROM thing", dbConnection

do while not rs.eof
    response.write "(" & rs("title") & ")" & "(" & rs("title") & ")" & "<br />"
    rs.movenext
loop

我第一次使用rs("title") 时,我得到了返回值。在该循环中第一次之后的任何时间,rs("title") 返回一个空白值。

同样,这似乎只发生在 nvarchar(max) 字段中。

谁能阐明这种行为以及如何解决它?

【问题讨论】:

    标签: sql-server-2008 iis-7 asp-classic vbscript


    【解决方案1】:

    在 Server 2012 和 2016 上使用 DSN 时,此问题仍然存在或重新出现。

    使用 DSN 通过直接层发送数据,该层似乎可以很好地处理 varbinary(max) 但不能处理 varchar(max) 或 nvarchar(max)。

    这有点糟糕,因为随着时间的推移,如果您的实际结果超过 9K(在我的情况下是 400K),似乎内存/代码损坏和服务器错误以及模糊的外部组件错误

    【讨论】:

      【解决方案2】:

      非常古老的线程 - 承认。但我遇到了这个问题,这让我发疯了。

      我通过像这样更改我的连接字符串来解决这个问题:

      objConn.Open "Driver={SQL Server}; Server=(local); Database=<what-your-database-is-called>; Uid=sa;Pwd=sa;"
      

      到:

      objConn.Open "Provider=SQLNCLI; Server=(local); Database=<what-your-database-is-called> ; Uid=sa;Pwd=sa;"
      

      因此,从本质上讲,删除 Driver={SQL Server} 并添加“Provider=SQLNCLI;”,修复此问题。

      我现在可以看到在我的经典 ASP 页面中正确显示的 nvarchar(max) 列。

      希望这对某人有所帮助。

      【讨论】:

      • 更改连接字符串中的提供程序解决了我们遇到的问题,该问题阻止将任何字符串插入 nvarchar(max) 字段。产生的错误:Microsoft OLE DB Service Components error '80040e21' Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done. 希望这对尝试使用 Microsoft 文档解决问题的人有所帮助。
      【解决方案3】:

      我做了 cast(columName to varchar),它对我有用。

      【讨论】:

      • 快速说明我必须使用 CAST AS 而不是 CAST TO,但这对我来说效果很好。
      【解决方案4】:

      我刚刚遇到了类似的问题(仅限 SQL Server 2005,而不是 2008):

      If Not IsNull(rs("Title")) Then
          Response.Write "The title: " & rs("Title") 
      End If
      

      Response.Write 已执行,但标题本身未显示。

      我花了很长时间才发现 ASP Classic 和 nvarchar(max) 的组合导致了问题。
      然后我找到this 并做了那里描述的事情......我将代码更改为:

      SomeVariable = rs("Title")    
      If Not IsNull(SomeVariable) Then
          Response.Write "The title: " & SomeVariable 
      End If
      

      【讨论】:

        【解决方案5】:

        如果你看一下这个链接,http://msdn2.microsoft.com/en-us/library/ms130978.aspx 它说让 SQL Server Native Client 能够获得最新的特性,比如 SQL2005 中引入的 varchar(max),所以我认为使用它可能会工作即使您使用的是 SQL 2008,您也一样。

        【讨论】:

        • 这很有趣。该提供程序似乎没有安装在我的服务器上,所以我必须看看如何在那里安装它。我会告诉你进展如何。
        • @MarkBiek 你还在做这个吗?完成后告诉我进展如何。 :)
        • 我处理这个问题已经有一段时间了,但上面的答案对我有用。
        【解决方案6】:

        除了'在显示之前将其拉入变量'...我隐约记得同事需要一些 hack 与 asp/sql/varchar(max) 查询,就像它必须是最后一列(或者不是最后一列列)在查询中。真的很抱歉含糊不清,自从我不得不处理asp以来已经有几年了。

        【讨论】:

          【解决方案7】:

          不确定是不是这个原因,但值得注意的是 varchar(max) 类型直到经典 ASP 的最后一个版本发布之后才添加到 Sql Server。所以很有可能老的 ado 提供者只是不知道如何处理这些字段。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-02-29
            • 2010-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-16
            相关资源
            最近更新 更多