1

Microsoft SQLデータベースに対して、Delphi内で実行しようとしているSQLの非常に大きなブロックがあります。私はこれを取得しています:

  Multiple-step OLE DB operation generated errors. 
  Check each OLE DB status value, if available. No work was done.

スクリプトには複数のSQLIFステートメントがあり、その後にストアドプロシージャの呼び出し、変数の宣言などを含むブロックがありBEGINます。最後に、変数値の一部を。で返します。ENDEXECSELECT @Variable1 AsName1,@Variable2 AsName2...

上記のマルチステップエラーは、DelphiコードからではなくADOからのOLEExceptionとして発生し、すべてのSQL exec-stored-procedureが発生した後に発生するため、最終段階に達したときにこのOLE例外が発生していると思われます。SELECT @Variable1 AsName1,...プログラムがそれらを表示するために、いくつかの変数値を取得します。

私はこの廃止/非推奨のMSKB記事について知っていますが、残念ながらこれは私の実際の問題ではありません。

http://support.microsoft.com/kb/269495

つまり、KBの記事では、レジストリキーを修正し、接続文字列から「永続的なセキュリティ情報」を削除するように指示されています。それは私の問題ではありません。私はすでに答えを見つけたのでこの質問をしています。ここで立ち往生している他の誰かが、数時間解決策を探した後に見つけたいくつかの問題がある場合、潜在的な問題を見つけるのに数時間を無駄にしたくないと思うかもしれません。さまざまなオプションを使用して別の回答を追加したい場合は、問題ありません。再現可能であれば、あなたの回答を選択します。必要に応じて、この「ADOレコードセット」の原因が不明な場合があるため、これをコミュニティWikiに変換します。気分が悪く、T-SQLの例外に不満を持っています。

4

3 に答える 3

2

ドキュメントのさまざまなソースにリストされているいくつかの潜在的な原因を見つけました。質問の元のKB記事は、ADO接続文字列から「永続的なセキュリティ情報」を削除することを提案していますがTADOConnection、1つだけのアプリケーションでのスタンドアロンテストでTADOQueryは、存在または不在はPersist Security Info効果がなく、明示的に設定しませんでした正しいか間違っているか。

CursorTypeこの宣言を削除することで修正されたDIDは次のとおりです。

CursorType=ctKeyset

私が学んだことは、双方向ADOデータセットはSELECT * FROM TABLEADOでは問題ありませんが、複雑なSQLスクリプトではそれほど問題がないということです。

于 2013-03-25T16:39:01.277 に答える
1

このエラーの潜在的な原因は、charフィールドを大きな値で更新することです。

例:フォームには、最大長プロパティが20文字に設定された編集ボックスがあり、Oracleデータベーステーブルにはchar(10)として定義されたフィールドがあります。10文字(またはそれ以下)で更新すると正常に機能しますが、10文字を超える更新では、ADOQuerry.UpdateBatch()で「複数ステップ...」エラーが発生します。また、CHARは常に20文字になることを知っておく必要があります。編集ボックスの値のトリミングを検討してください。CHARはVARCHAR2タイプとは異なる動作をします。

于 2013-08-13T14:00:04.707 に答える
0

パラメータを使用したクエリがある場合は、クエリ内のパラメータの数がスクリプトと一致していることを確認してください...!

于 2016-11-08T11:36:02.627 に答える