2012-06-14 4 views
24

ADO/OleDB、delphi TADOQuery/TADOCommand、およびパラメータの件名で互いに矛盾する回答があるようなStackOverflowに関するいくつかの質問があります。場合によっては、ADOコンポーネント、特にTADOCommandは、名前のない名前付きパラメータでより確実に動作しますか?

パラメータは、ADOコンポーネントのCommandTextまたはSQLプロパティに2つの方法で導入できます。私のためにほとんどの時間を作業名前付きパラメータは、コロンで導入されています

select a, b, c from bar where bat = :baz 

これは、うまく私のために時間の99%を、動作します。 「:バズ」を毎日のようにして、私はADOまたはその周辺のDelphiのラッパーは、受け入れないことを見つけて、私が代わりにこれを書いている必要があります

select f, g, h from bar where bat = ? 

これは無名のパラメータで、代わりに指定されたパラメータの結果。 ADOクエリまたはADOコマンドに1つのパラメータしか含まれていない場合、これは大きな問題ではありません。しかし、それはADOが私の上で行動するときではありません。

delete from bar where id = :id1 
delete from bat where id = :id2 

私はこれにそれを変更しなければならなかった:昨日は1つのCommandTextを文字列に2つのコマンドを使用して、このように、今日の単一TADOCommandはオブジェクト内のデュアルコマンドを使用して、別の方法を一方向に行動し、そして

delete from bar where id = ? 
delete from bat where id = ? 

昨日終わった。今日、私はそれを動作させるために最初のバージョンに戻す必要がありました。症状は、ADOパラメータが消えて戻ってこないということでした。コマンドを実行しようとすると、Parameters[0]にアクセスしようとすると、インデックスが範囲外です。パラメータがなくなるという警告は表示されません。これは、ADOデータセットへのいくつかの接続が、デザイン時に、特にTADOCommandコンポーネントをジョグしているように見えます。クエリやコマンドを記述しようとすると、特にうんざりしますが、ADOコンポーネントは "?"を受け入れないことに決めました。今すぐ ":x"を入力してください。あるものから別のものへ切り替えることによって、機能することができないことがあります。しかし、それは私を挫折させ、おそらく実際には他の人々を完全にブロックします。私は一部の人々が常に動的にコードでSQLを構築し、Parametersを使用しないことを知っています。おそらくはこれが理由ですです。私は予想しています私の質問に

可能な答えは以下のとおりです。

  1. ADOは、複数のコマンドをサポートしていない、または少なくともDelphiのラッパーにはありません。あるいは、TADOCommandはここではうまく動作しません。

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

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

私はDelphi XE2を使用していますが、2007年、2009年、2010年、およびXEで同様にdodgyの動作を見たことがあります。 私はOLEDBプロバイダとしてSQL Server用のMicrosoft OLEDB Providerを使用しています。

+0

2つのコマンドを(SQL Serverの場合)セミコロンで区切ると違いがありますか? –

+0

データ認識コントロールを必要としないプロジェクトでは、ADODBとADOIntを直接使用することに切り替えました。ここでは:http://xxm.svn.sourceforge.net/viewvc/xxm/trunk/Delphi/demo2/03%20Data/xxmData.pas?view=markupこれはパフォーマンスのために何をチェックしていませんが、本当にすべきですこれらの日のうちの1つをチェックしてください(私の結果を回答として投稿してください)。 –

+0

SilentD:私はセミコロンを試します。私の想いは、DelphiのADコンポーネントはセパレータもうまくサポートしていないということです。 –

答えて

0

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

なぜか分かりません。この問題が発生した場合は、最初に正しいOLEDBプロバイダを使用していることを確認し、どのバージョンを確認しますか。また、あなたが生成した悪いSQLに起因する潜在的な解析エラーもチェックしてください。

私は、ソースコードを持たないコードでOLEDBプロバイダ内部の動作がこのクルークに責任があると思われます。 DelphiのADOクラスラッパーは、Delphiのデータベースコンポーネントレイヤーアーキテクチャーから、ADO RecordSetsを扱う一連のCOMオブジェクトのフードラッパーの下にあるADOのコア照会/テーブル/データセットAPIへのトランスレーターです。

0

残念ながら、私はしばらくのうちにDelphiを使用していないので、この回答をDelphiの観点から検証する方法はありません。

名前付きパラメータの先頭にコロン(:)が付いているのは初めてです。通常、ADODBでは、名前付きパラメータにはat(@)という接頭辞が付きます。名前のないパラメータには疑問符(?)が付きます。名前付きパラメータの

1つの重要な利点は、再利用するための能力、ADODBのレベルでは、すなわち

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

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

+1

"通常、ADODBでは、指定されたパラメータの先頭にat(@)が付きます。 - ADODBには、ストアドプロシージャのパラメータを除いた名前付きパラメータはありません。一般的に使用されるSQLOLEDBプロバイダは、少なくともそれらを持っていません。 ADO.NETでは名前付きのパラメータが使用できますが、@接頭辞が付いていますが、ADO.NETはDelphiから簡単には使用できません。 – hvd

1

名前付きパラメータ:?私はいつもVisual Studio(ADO.NET)でも@と一緒に使っていました。 T-SQLのパラメータと変数には、接頭辞@が付いています。

はそれで問題を抱えて覚えていない...あなたが代わりに( は、Windowsに付属している)SQL ServerのOLEDBプロバイダの(SQ​​L Serverクライアントをインストールしてインストール)ネイティブクライアント を選択していないあなたは確かにいますか?

関連する問題