2017-07-31 23 views
1

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で何が起こっているか知ってみたい...

+0

問題コードでcreate rsオブジェクトを忘れた場合snippit: 'set rs = server.CreateObject(" ADODB.Recordset ")' – cdre

+0

@JoshMontgomeryのおかげで、これを 'RS.Open'に絞り込み、 2番目の呼び出し。 'set RS = cn.Execute(SQL) 'を使用しても同じ問題は発生しません – cdre

答えて

1

直接、私は堰を持っていた

RS.Open SQL, cn, adOpenStatic, adLockReadOnly 

ではなく、むしろ

セットRS = cn.Execute(SQL)

を使用していません過去にRS.Openを使用して問題を解決し、レコードセット内のデータを直接変更する必要がある場合にのみ使用します。これは一般的ではありません。

+0

提案をいただきありがとうございます。それは助けにはなりませんでしたが、それは良い考えです。新しい開発コードで 'set RS = Stmt.Execute()'を使っています。 – cdre

+0

実際には、私はそれを取り戻す...私は2番目のサイトを作成し、その変更を間違ったものでテストしました。次の質問は、 'RS.Open'がsqlへの2番目の呼び出しを引き起こし、' cn.execute'がなぜそうでないのでしょうか?私は1つのテストサーバーのために60k +行のコードを変更することはできません。 – cdre

+0

私はカーソル関連の問題だと思っています。報告書が戻ってこない場合は、SQL、cn、3 ,, 1を開いてみてください。 –