2

私はいくつかの古いコードを調べていて、ポイントを理解していないように見える部分を見つけました....私が知る限り、それは単なる挿入です。しかし、なぜ彼らはこのようにしたのですか?挿入物に書き直しても大丈夫ですか、それとも何かを壊す可能性がありますか?

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

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
4

4 に答える 4

5

ソースのこの部分は私を少し混乱させました.... where 1 = 2??? どうやら、一致しないようにする目的があったようです。

とにかく、このスタイルのプログラミングは ADO テクノロジを使用してかなり古いものであり、DAO から ADO に移行する人々は、カーソルを開いてこの方法でデータベースを反復処理することがよくあります...物事を行う方法に関する最新のベストプラクティスに従っていません。挿入ステートメントに置き換える必要があります。

jet4.0/access 2000 より前に記述された可能性があります。この場合、パラメータ化されたストアド プロシージャをシミュレートしようとしました。ただし、システムがそれよりも新しい場合は、複数の利点があるため、ストアド プロシージャを使用することを強くお勧めします。キャッシュされた実行計画、SQL インジェクションの可能性を減らすためのパラメーター

私は実際、12年ほど前にそのようなコードを書いていました:p 使用している技術に関係なく、よく知らなかったからです。

于 2012-01-10T19:55:05.877 に答える
2

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

1 = 2、SQL が一致を返さないように強制します。これは基本的に、コマンド (?) を構築する方法であり、「便利に」値を変更し、更新によってそれが保存されるようにします。

私は以前にそれが行われたのを見たことがありますが、自分でそのようにしたことはありません。他の人が言ったように、単純なパラメタ化された INSERT ステートメントの方が優れています、IMO。

于 2012-01-10T20:01:06.280 に答える
1

パラメータ化された ADO クエリを使用してこれを書き直します。使用されているメソッドには不要な が含まれているためSELECTINSERT速度が低下します。

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

于 2012-01-10T19:56:40.180 に答える
1

私は挿入ステートメントを利用します。上記のコードは少し「怠惰」に見えます... 「ADO に仕事を任せてください」のように。ただし、実際には何も問題はありません。そのwhere 1=2部分は「空のテーブル」を返すためにそこにありました...ええと...つまり、レコードセットです。

于 2012-01-10T19:57:21.067 に答える