25

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ます

私が予想している私の質問に対する可能な答えは次のとおりです。

  1. ADO は複数のコマンドをサポートしていません。少なくとも Delphi のラッパーはサポートしていません。または、TADOCommandここでは確実に機能しないかもしれません。

  2. パラメータは、すべての ADO またはすべての Delphi の ADO ラッパーでバグのある領域ですか?

  3. あなたはそれを間違っています。

私は Delphi XE2 を使用していますが、2007 年、2009 年、2010 年、および XE で同様の危険な動作を見てきました。Microsoft OLEDB Provider for SQL Server を OLEDB プロバイダーとして使用しています。

4

3 に答える 3

1

:?を使用した名前付きパラメータ @Visual Studio(ADO.NET)でも、常に使用していました。また、T-SQL のパラメーターと変数では、プレフィックスが@.

問題が発生したことを覚えていないでください... SQL Server 用の OLEDB プロバイダー (Windows に付属) の代わりに、ネイティブ クライアント (SQL サーバー クライアントのインストールと共にインストール) を選択していませんか?

于 2012-10-04T21:53:05.900 に答える
0

残念ながら、私はしばらく Delphi を使用していないため、Delphi の観点からこの回答を検証する手段がありません。

コロン ( ) で始まる名前付きパラメーターを見たのはこれが初めて:です。通常、ADODB では、名前付きパラメーターの前にアットマーク ( )@が付けられ、名前のないパラメーターには疑問符 ( ?) が付けられます。

名前付きパラメーターの重要な利点の 1 つは、再利用できることです。つまり、

INSERT INTO TABLE T VALUES (@id, @id, 'Hello World');

ADODB レベルで。名前付きまたは名前なしのパラメーターを使用するCommandText.Parameters.Refreshと、パラメーターを作成するための高速な手段として使用できます。

于 2012-10-04T21:08:46.843 に答える
0

?はい、パラメータが失敗する場合があります。パラメータを使用する必要がある場合があり:namedます。Name プロパティを設定すると、ADO クエリ、データセット、またはテーブルのデバッグも容易になるため、名前付きパラメーターには、DB パラメーター値の操作に利点があります。

私はなぜなのか理解していない。この問題が発生した場合は、まず正しい OLEDB プロバイダーを使用していることを確認し、バージョンを確認してください。また、生成された不適切な SQL が原因で発生する可能性のある解析エラーも確認してください。

ソースコードを持っていないコードの OLEDB プロバイダー内の内部動作が、この癖の原因であると思われます。Delphi ADO クラス ラッパーは、Delphi のデータベース コンポーネント レイヤー アーキテクチャから ADO のコア クエリ/テーブル/データセット API へのトランスレータであり、これらはすべて、ADO RecordSetを処理する一連の COM オブジェクトの内部ラッパーです。

于 2015-12-14T17:38:16.907 に答える