StackOverflow には、ADO/OleDB、delphi TADOQuery/TADOCommand、およびパラメーターの主題に関して互いに矛盾する回答があるように見えるいくつかの質問があります。
パラメータは、ADO コンポーネントの CommandText プロパティまたは SQL プロパティの 2 つの方法で導入できます。私にとってほとんどの場合機能する名前付きパラメーターは、コロンで導入されます。
select a, b, c from bar where bat = :baz
これは、私にとっては99%の時間でうまくいきます。ADO や Delphi のラッパーが ":baz" を受け付けず、代わりに次のように書く必要があることが時々わかります。
select f, g, h from bar where bat = ?
これにより、名前付きパラメーターではなく、名前のないパラメーターが生成されます。ADO クエリまたは ADO コマンドに含まれるパラメーターが 1 つだけの場合、これは大した問題ではありません。しかし、それはADOが私に行動を起こすときではありません. 昨日は 1 つの方法で動作しましたが、今日では、1 つの CommandText 文字列で 2 つのコマンドを使用して、次のように 1 つの TADOCommand オブジェクトでデュアル コマンドを使用して別の方法で動作しました。
delete from bar where id = :id1
delete from bat where id = :id2
これを次のように変更する必要がありました。
delete from bar where id = ?
delete from bat where id = ?
昨日は終日稼働。今日、それを機能させるために、最初のバージョンに戻さなければなりませんでした。症状は、ADO パラメーターが消えて元に戻らないというものでした。また、コマンドを実行しようとすると、 にアクセスしようとすると、index out of range というエラーが発生しますParameters[0]
。パラメータがなくなるという警告は何もありません。設計時に、ADO データセットへのいくつかの接続によって、TADOCommand
コンポーネント、特に、それは「ちょうど私を壊します」。クエリやコマンドを書き込もうとしていて、それが機能することはわかっているのに、ADO コンポーネントが "?" を受け入れないことを決定した場合、これは特に腹立たしいことです。または ":x" 今すぐ。一方から他方に切り替えることで、完全に機能しないことを回避できます。しかし、それは私をイライラさせ、おそらく実際には他の人を完全にブロックします. 一部の人々は常にコードで SQL を動的に構築し、 の使用を避けていることを私は知ってParameters
います。
私が予想している私の質問に対する可能な答えは次のとおりです。
ADO は複数のコマンドをサポートしていません。少なくとも Delphi のラッパーはサポートしていません。または、
TADOCommand
ここでは確実に機能しないかもしれません。パラメータは、すべての ADO またはすべての Delphi の ADO ラッパーでバグのある領域ですか?
あなたはそれを間違っています。
私は Delphi XE2 を使用していますが、2007 年、2009 年、2010 年、および XE で同様の危険な動作を見てきました。Microsoft OLEDB Provider for SQL Server を OLEDB プロバイダーとして使用しています。