1

ADODB 経由で Postgres データベース (8.2) と通信する従来の asp-vba コードをクリーンアップしています。現時点では、SQL ステートメントの文字列構築を使用しています。明らかに、SQL インジェクションを回避するために準備済みステートメントを使用したいと考えています。

名前付き変数でこれを行う方法がわかりません。「?」で成功しただけです。演算子を使用し、SQL で定義されている順序でパラメーターを追加します。これは私の状況では良くありません[1]。

? を使用して、いくつかの簡単なパラメーター置換を行うことができました。演算子と CreateParameter(...):

var oCmd = Server.CreateObject("ADODB.Command");
oCmd.CommandText = "SELECT * FROM sometable WHERE somefield = ? AND another = ?";
oCmd.Parameters.Append oCmd.CreateParameter("", adVarChar, adParamInput, 50, "val1")
oCmd.Parameters.Append oCmd.CreateParameter("", adVarChar, adParamInput, 50, "val2")

しかし、私が名前でそれをやろうとすると、うまくいきません:

var oCmd = Server.CreateObject("ADODB.Command");
oCmd.CommandText = "SELECT * FROM sometable WHERE somefield = @a AND another = @b";
oCmd.Parameters.Append oCmd.CreateParameter("@b", adVarChar, adParamInput, 50, "val2")
oCmd.Parameters.Append oCmd.CreateParameter("@a", adVarChar, adParamInput, 50, "val1")

実際にはODBCの失敗である可能性があるというメモがいくつかあります(http://www.codeproject.com/Tips/231217/Parameters-SqlCommand-vs-OledbCommand-and-OdbcComm)。誰かがこれまたは他のオプションを回避する方法を知っていますか?

[1]残念ながら使えない?? ? パラメータを順番に定義します。コードは、値を順不同でサブする従来の ORM に既にラップされています。名前で送信できれば、これをきれいに行うことができます。

ヘルプやポインタをいただければ幸いです。

4

1 に答える 1

2

以前、adodb (リリース 2004) の postgres ドライバーを変更して、postgres ステートメントで両方のパラメーターを処理し、正規表現を使用できるようにする必要がありました。問題は、「?」を使用することでした。疑問符は常にパラメーターとして解釈されます。そこで、 _queryメソッドの Postgres 7 ドライバーを変更し、 151 行目を次のように変更しました。

$sqlarr = explode(' ?',trim($sql)); 

疑問符の前にスペースを追加するだけです。「?」ドライバによって $1、$2 などに置き換えられるため、この置換により、"?" の代わりにこの名前付きパラメータ $1、$2 が送信されると予想される場合があります。

アブラソ

于 2015-10-14T18:13:46.890 に答える