【发布时间】:2017-07-31 03:49:08
【问题描述】:
我在 IIS 10(使用 asp classic 作为 api)和 SQL Server 2016 中有一个新的开发/测试环境。今天,我注意到一些帖子在数据库中增加了一倍的记录。
经过进一步审查,IIS 日志仅显示一个请求,但 SQL Trace 显示 2 个并发 SQL:BatchCompleted 跟踪,每次调用使用不安全的cn.execute "stored_procedure 'param1'" 方法的数据库,但任何使用准备好的语句的数据库调用只有一个 RPC :在跟踪中完成命中并且表现正常。
我们的生产环境具有相同的 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 注入等),因为我们没有分配时间来重构准备好的语句。但是,所有新代码都是用准备好的语句编写的。
更新
SQL Native Client 11 中似乎有些不同。从 SQL 2008 R3 获取版本 10,它不再进行双重调用。
Provider=SQLNCLI10
我想在这一点上,我可以继续使用版本 sqlncli 10,但我很想知道 sqlncli 11 发生了什么......
【问题讨论】:
-
如果忘记在问题代码片段中创建 rs 对象:
set rs = server.CreateObject("ADODB.Recordset") -
感谢@JoshMontgomery,我们已将范围缩小到
RS.Open创建第二个电话。使用set RS = cn.Execute(SQL)不会导致同样的问题
标签: sql-server asp-classic iis-10