2

概要:
ユーザーがクエリを定義し、サーバーに送信して結果を表示できるようにするアプリケーションを作成しました。ソフトウェアはDB2またはMySQLで実行できます。

問題:
DB2バージョンで、ユーザーがクエリを実行しようとしたときに、ユーザープロファイルが無効になっているためにクエリが失敗したという問題が発生しました。DB2(IBM i上)で照会を実行するために、ユーザーのプロファイル名とパスワードが接続ストリングに指定されています。サーバーのセキュリティでは、2回または3回の誤ったログイン後にユーザーのプロファイルが無効になるように指定できます。

質問:
アプリケーションをデバッグしましたが、問題はクエリが2回送信されていることにあることがわかりました。ユーザーのパスワードが間違っている場合は、もちろん、これはユーザーのプロファイルを無効にするというノックオン効果があります。

さらに詳しく調べてみると、サーバーのログを(1行ずつデバッグしながら)調べたところ、TADOQuery.sql.add()を呼び出したときと、TADOQueryのを呼び出したときに、クエリがサーバーに送信されることがわかりました。アクティブプロパティはtrueに設定されます(これは、クエリがサーバーに送信されると予想されるポイントです)。クエリの実行に使用しているコードの例を次に示します。

adoqry.active := false;
adoqry.sql.clear;
adoqry.sql.add('SELECT * FROM SOMEDB.SOMETABLE');
adoqry.active := true;

したがって、私の質問は非常に単純です
。1. TADOQuery.sql.add()メソッドがクエリを送信するのはなぜですか(TADOQueryのsqlプロパティにSQLを追加する必要がある場合)。
2.これを防ぐために何ができますか?つまり、add()メソッドを呼び出したときにSQLが送信されないようにする方法はありますか?

ログに関する追加情報が必要な方のために、IBM iの出口点ログは、上記の例でadoqry.sql.addを呼び出すと、クエリが「データベースサーバー-SQL要求」出口を介して実行されることを示しています。 「準備と説明」機能を介したポイントアプリケーション。上記の例でadoqry.active:= trueを呼び出すと、同じクエリが同じ出口点アプリケーションを通過しますが、「Open/Describe」関数を経由します。

IBM iに精通していない場合でも、心配する必要はありません。送信されたクエリを2回トレースした証拠として、その情報を含めているだけです。本当の問題は、TADOQueryのsql.add()処理にあります。

4

1 に答える 1

2

問題の説明から、ADOQueryのConnectionStringを指定すると仮定します。これを行うと、データベースログインとクエリの実行が組み合わされます。ユーザーの資格情報が無効な場合、これには望ましくない副作用があることがわかりました。

ADOConnectionを使用して、データベースログインをクエリから分離します。ADOConnectionのConnectionStringを指定し、ADOConnectionをADOQuery.Connectionプロパティに割り当てます。このようにして、データベースログインを制御し、不正な資格情報を持つログインをキャッチできます。さらに、ADOConnection.Openメソッドを使用すると、ユーザー名とパスワードを指定できるため、ConnectionStringに入力する必要はありません。

これは特定の質問に答えるものではありませんが、このアプローチは、ログインをクエリの実行から分離することにより、ユーザーのプロファイルが無効になる問題を解決するのに役立ちます。

于 2011-08-03T23:23:56.073 に答える