在IIS10中用ASP执行两次SQL经典
我有一个新的开发/测试环境,它在IIS 10(带有asp classic as api)和SQL Server 2016中。今天,我注意到有些帖子是数据库中记录的两倍。 经过进一步的审查,IIS日志只显示一个请求,但SQL Trace显示2个并发的SQL:使用不安全的cn.execute "stored_procedure 'param1'"
方法对数据库的每次调用都使用BatchCompleted跟踪,但任何带有预处理语句的数据库调用只有一个RPC:跟踪完成,正常运行。在IIS10中用ASP执行两次SQL经典
我们的生产环境具有相同的SQL版本,但目前仍在IIS6中。几个星期前我用相同的设置丢失了我的开发IIS框,之前没有注意到这一点。在未发生这种情况的情况下,我们大约90%的API已经在生产中使用了十多年,现在还没有发生。
我对IIS 10有点新,因为我一直在维护IIS6环境,所以也许我配置了错误的东西,但除了启用ASP经典和父路径之外,我还没有修改太多以获得我们的遗留API运行。 ASP的
样品,是造成双重执行:
dim cn
dim dbConnectionString
dim SQL
dim rs
dbConnectionString = "Provider=SQLNCLI11;Server=srvr\instance;Database=DB;Uid=user;Pwd=pass;"
Set cn = Server.CreateObject("ADODB.Connection")
cn.open dbConnectionString
cn.CommandTimeout = 0
SQL = "store_procedure_name 'paramValue'"
RS.Open SQL, cn, adOpenStatic, adLockReadOnly
Response.Write(rs(0))
rs.Close
set rs = nothing
Response.end
并利用ADODB准备在正常执行语句结果。
Dim cmd
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = cn
.CommandType = adCmdStoredProc
.CommandText = "StoredProcedureName"
.CommandTimeout = 0
End With
我错过了什么令我疯狂的整日?大部分API使用不太安全的字符串方法(我知道SQL注入等),因为我们尚未分配时间来重构准备好的语句。但是,所有新代码都是用预先准备的语句编写的。
UPDATE
看来事情是从SQL 2008 R3在SQL Native Client的11版本抢下10个不同的,它是不是在做两个人通话了。 Provider=SQLNCLI10
我想在这一点上,我可以用版本SQLNCLI 10继续,但我很想知道是怎么回事,有SQLNCLI 11 ...
,因为你没有更新的记录集对象直接,不使用
RS.Open SQL, cn, adOpenStatic, adLockReadOnly
而是
集RS = cn.Execute(SQL)
我已经堰d过去使用RS.Open的问题,只有在我想直接在记录集中修改数据时才会使用它,这对我来说是很少见的。
如果在问题代码snippit中忘记了创建rs对象:'set rs = server.CreateObject(“ADODB.Recordset”)' – cdre
感谢@JoshMontgomery,我们将其缩小到'RS.Open',创建一个第二个电话。使用'set RS = cn.Execute(SQL)'不会导致相同的问题 – cdre