2

私はいくつかの古いコードを見て、私ができない部分を見つけました....という点を理解しているようです。私が知る限りでは、単なる挿入物です。なぜ彼らはこのようにしましたか?インサートに書き直してもいいですか、あるいは何かを壊す可能性がありますか?クラシックASPを理解する

下記を参照してください。

Set TextRS = Server.CreateObject("ADODB.RecordSet") 
Set TextRS.ActiveConnection = Conn 
TextRS.Source = "SELECT IDX,TIMESTAMP,CURRENTFLAG,TEXT FROM " & TextTable & " WHERE 1=2 FOR UPDATE" 
TextRS.CursorLocation = 2 
TextRS.CursorType = 3 
TextRS.Open ,,,3 

TextRS.AddNew 
TextRS(0).Value = IDX 
TextRS(1).Value = Timestamp 
TextRS(2).Value = "Y" 
    TextRS(3).AppendChunk TextPiece 
TextRS.Update 

TextRS.Close 
+0

これは、挿入文をパラメータ化してSQLインジェクションを回避する方法の1つです。これをINSERTステートメントに変更する場合は、クエリのパラメータ化を確認してください。 –

答えて

5

ソースのこの部分は私に少し混乱.... where 1 = 2 ??? どうやらそれは一致がないことを保証する目的がありました。

とにかくこのスタイルのプログラミングはADO技術を使ってかなり古く、DAOからADOに向かう人はこのようにデータベースを繰り返し処理するためにカーソルを開くことがあります...現代のベストプラクティスに従う方法はありませんinsert文で置き換えることができます。

pre jet4.0/access 2000と書かれている可能性があります。この場合、パラメータ化されたストアドプロシージャをシミュレートする試みでした。システムがそれよりも現代的であれば、私はストアドプロシージャを使用することを強くお勧めします。キャッシュされた実行計画、SQLインジェクションの可能性を減らすためのパラメータ

私は実際には12年前のようなコードを書いていましたが、これは主に私が使い慣れた技術に関係なく、

+1

そのコードは、すべてのコードがレコードを挿入するためのものであるときに結果が返されないことを確認するためのものです。 –

+0

+1このタイプのDBコーディングが実際に出てきた答えは+1です。 – AnthonyWJones

+1

-1:元のプログラマーにいくつかのクレジットを与えるべきだと思います。 1つは、反復が行われず、 '1 = 2 'は役に立たないことではありません。スキーマ定義を含む空のレコードセットを取得するために使用されます。実際には素晴らしいトリックです。 paramterizedクエリをシミュレートしてSQLインジェクションを回避する簡単な方法としてこれが行われました。書き直しをINSERTとして提案しますが、パラメータ化されたクエリを使用することを推奨しないため、使用される技術の最も重要な利点の1つを無効にします。 – RedFilter

1

パラメータ化されたADOクエリを使用してこれを書き換えます。使用されているメソッドには不要なSELECTがあり、INSERTが遅くなります。

そのコードはあいまいですが、レコードセット行の空のインスタンスを作成して、値を設定してレコードセットを再保存できるようにしています。これは、まっすぐなINSERTを行うよりもはるかに遅くなることになります。

1

私はinsert文を使用します。上記のコードは少し怠けているようです... "ADOが私のために仕事をする"ように。しかし、本当に間違っていることはありません。 where 1=2部分は "空のテーブル"を返すためにそこにいた... um ...私はレコードセットを意味します。

2

ああ、古き良き古典的なASP;)

1 = 2は試合を返さないようにSQLを強制します。それは基本的にはコマンドをビルドする方法です(?)ので、値を "便利に"変更してから更新して保存することができます。

私はこれまでに行ったことを見たことがありますが、それは自分自身のようにはしませんでした。他の人が言っているように、簡単なparemetised INSERTステートメントは、より良いだろう、IMO。