在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 ...

+0

如果在问题代码snippit中忘记了创建rs对象:'set rs = server.CreateObject(“ADODB.Recordset”)' – cdre

+0

感谢@JoshMontgomery,我们将其缩小到'RS.Open',创建一个第二个电话。使用'set RS = cn.Execute(SQL)'不会导致相同的问题 – cdre

,因为你没有更新的记录集对象直接,不使用

RS.Open SQL, cn, adOpenStatic, adLockReadOnly 

而是

集RS = cn.Execute(SQL)

我已经堰d过去使用RS.Open的问题,只有在我想直接在记录集中修改数据时才会使用它,这对我来说是很少见的。

+0

感谢您的建议。它没有帮助,但这是个好主意。我在我们的新开发代码中使用'set RS = Stmt.Execute()'。 – cdre

+0

实际上,我回过头来......我创建了第二个站点,并对错误的站点进行了测试 - 这样可以阻止第二个跟踪发生......进展!下一个问题是为什么'RS.Open'导致第二次调用sql和'cn.execute'不是?由于一台测试服务器,我无法更改60k +代码行。 – cdre

+0

我的猜测是这是一个游标相关的问题,请尝试RS。打开SQL,cn,3 ,, 1,如果这不起作用,请回报,我会看到(或其他人)可以想出其他的东西来尝试 –