IIS 10(asp classic as api)とSQL Server 2016の新しい開発環境があります。今日、一部の投稿でデータベースのレコードが倍増していました。 さらに、IISログには1つの要求しか表示されませんが、セキュリティ保護されていないcn.execute "stored_procedure 'param1'"
メソッドを使用してデータベースへの呼び出しごとに2つのSQL:BatchCompletedトレースが同時に表示されますが、トレースでヒットを完了し、通常のように動作しています。ASPのクラシックでIIS10でSQLが2回実行する
私たちのプロダクション環境は同じSQLバージョンですが、現在IIS6にあります。私は数週間前に同じ設定で私のdevのIISボックスを失って、これを気づいていなかった。私たちのAPIの約90%は、このような事態が起こることなく、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ネイティブクライアント11.つかんバージョン10で異なっており、それはもう2度の呼び出しを行っていません。 Provider=SQLNCLI10
あなたがレコードセットオブジェクトを更新していないので、私はこの時点で、私はバージョンSQLNCLI 10を続けることができますね、私はSQLNCLI 11で何が起こっているか知ってみたい...
問題コードでcreate rsオブジェクトを忘れた場合snippit: 'set rs = server.CreateObject(" ADODB.Recordset ")' – cdre
@JoshMontgomeryのおかげで、これを 'RS.Open'に絞り込み、 2番目の呼び出し。 'set RS = cn.Execute(SQL) 'を使用しても同じ問題は発生しません – cdre