ASP Classic,SQL 2008,XML输出和DSN与DSN-Less生成中文字母

时间:2010-04-21 19:14:56

标签: sql xml asp-classic ado dsn

过去一个月我一直遇到问题,似乎无法弄清楚出了什么问题。这是设置和一点背景。

背景:

我有一个在Windows Server 2003和SQL Server 2000上运行我的网站的网络主机。我的一个网页从SQL服务器将存储过程的结果集作为xml返回。以下是代码:

存储过程:

select top 10
    1 as tag
    , null as parent
    , column1 as [item!1!column1!element]
    , column2 as [item!1!column2!element]
from
    table1

for XML EXPLICIT

ASP页面:index.asp

Call OpenConn

Set cmd = Server.CreateObject("ADODB.Command")
With cmd
 .ActiveConnection = dbc
 .CommandText = "name of proc"
 .CommandType = adCmdStoredProc

 .Parameters.Append .CreateParameter("@RetVal", adInteger, adParamReturnValue, 4)
 .Parameters.Append .CreateParameter("@Level", adInteger, adParamInput, 4, Level)
End With

Set rsItems = Server.CreateObject("ADODB.Recordset")
With rsItems
 .CursorLocation = adUseClient
 .CursorType = adOpenStatic
 .LockType = adLockBatchOptimistic
 Set .Source = cmd
 .Open
 Set .ActiveConnection = Nothing
End With

If NOT rsItems.BOF AND NOT rsItems.EOF Then

 OutputXMLQueryResults rsItems,"items"

End If

Set rsItems = Nothing
Set cmd = Nothing

Call CloseConn



Sub OpenConn()
 strConn = "Provider=SQLOLEDB;Data Source=[hidden];User Id=[hidden];Password=[hidden];Initial Catalog=[hidden];"
 Set dbc = Server.CreateObject("ADODB.Connection")
 dbc.open strConn
End Sub

Sub CloseConn()
 If IsObject(dbc) Then
  If dbc.State = adStateOpen Then
   dbc.Close
  End If
  Set dbc = Nothing
 End If
End Sub

Sub OutputXMLQueryResults(RS,RootElementName)
 Response.Clear
 Response.ContentType = "text/xml"
 Response.Codepage = 65001
 Response.Charset = "utf-8"
 Response.Write ""
 Response.Write ""
 While Not RS.EOF
  Response.Write RS(0).Value
  RS.MoveNext
 WEnd
 Response.Write ""
 Response.End
End Sub

现:

一切都运行良好,直到我的主机升级到Windows Server 2008和SQL Server 2008.突然之间我得到了这样的结果:

来自浏览器:

Chinese Characters: Browser http://iphone.rolyrolls.com/chineseChars1.png

来自查看来源:

Chinese Characters: View Source http://iphone.rolyrolls.com/chineseChars2.png

但是,我发现如果我使用DSN连接strConn = "DSN=[my DSN Name];User Id=[hidden];Password=[hidden];Initial Catalog=[hidden];",它的效果非常好!

我现在的主持人不再支持DSN了,但这个问题超出了这个范围。有人告诉我使用ADO.Stream对象而不是Recordset对象,但我不确定如何实现它。

问题:

有没有人碰到这个并找到了修复它的方法?

那个ADO.Stream对象怎么样,有人可以帮我提供一个适合我代码的样本吗?

1 个答案:

答案 0 :(得分:0)

您可以查看connectionstrings.com


修改

对我来说,这似乎是一个数据库驱动程序问题 - 哪个驱动程序使用您的DSN连接?

更新

connectionstrings.com列出了与Provider=SQLNCLI10的SQL Native连接,但是当我为此提供程序生成.udl连接文件时,它显示Provider=SQLNCLI10.1所以这可能值得一试(如果你还没有尝试过这个) )。