1

サードパーティのデータベースの変更を監視する必要があるプロジェクトがあります。

SqlDependencyは良い解決策のように見えますが、サードパーティのアプリケーションで次のエラーが発生します。

次のSETオプションの設定が正しくないため、INSERTが失敗しました:'ANSI_NULLS、QUOTED_IDENTIFIER、ANSI_PADDING'。SETオプションが、インデックス付きビューおよび/または計算列のインデックスおよび/またはフィルター処理されたインデックスおよび/またはクエリ通知および/またはXMLデータ型メソッドおよび/または空間インデックス操作での使用に適していることを確認します。

(以下のテストプログラムが実行されていない場合、アプリケーションは正常に動作します)

これはどのSETオプションを参照していますか?

私が行った唯一の設定操作はALTER DATABASE TestDb SET ENABLE_BROKER、通知を有効にすることです。

私もしました:

CREATE QUEUE ContactChangeMessages;

CREATE SERVICE ContactChangeNotifications
    ON QUEUE ContactChangeMessages
    ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);    

これが、ManagementStudioでレコードを挿入/更新/削除すると正常に機能するLinqpadテストコードです。

void Main() {
    const string cs = "Data Source=.;Initial Catalog=TestDb;Trusted_Connection=True";

    var are = new AutoResetEvent(false);
    using (var connection = new SqlConnection(cs)) {
        connection.Open();
        SqlDependency.Start(cs);
        using (var cmd = new SqlCommand()) {
        cmd.Connection = connection;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT orderNo FROM dbo.Orders WHERE ProductNo = '111'";

            var dep = new SqlDependency(cmd, null, 60);
    dep.OnChange += (s,e) => { 
                Console.WriteLine(e.Info);
                are.Set();
            };
            using (var reader = cmd.ExecuteReader()) {
                while (reader.Read()) {
                }
            }
            are.WaitOne();
            SqlDependency.Stop(cs);
        }
    }
}

サードパーティのアプリがデータベースに接続する方法がわかりません。また、変更することもできません。さらに情報が必要な場合は、SQLプロファイラーを実行できます。

4

1 に答える 1

3

これは、エラーメッセージに記載されているSETオプションを正確に参照しています。

SETオプションの設定が正しくありません:'ANSI_NULLS、QUOTED_IDENTIFIER、ANSI_PADDING'。

正しい設定とその他の制限については、通知用のクエリの作成で説明しています。

SELECTステートメントが通知要求の下で実行される場合、要求を送信する接続には、接続のオプションが次のように設定されている必要があります。

ANSI_NULLS ON
ANSI_PADDING ON
ANSI_WARNINGS ON
CONCAT_NULL_YIELDS_NULL ON
QUOTED_IDENTIFIER ON
NUMERIC_ROUNDABORT OFF
ARITHABORT ON

注注

ANSI_WARNINGSをONに設定すると、データベース互換性レベルが90に設定されている場合、暗黙的にARITHABORTがONに設定されます。データベース互換性レベルが80以前に設定されている場合、ARITHABORTオプションを明示的にONに設定する必要があります。

これらの設定は、次の影響を受けます。

  • 現在のデータベース設定。sys.databases
  • で表示できるセッション設定sys.dm_exec_sessions
  • プロシージャ/トリガーによって設定を作成します。これは、を使用して表示できますOBJECTPROPERTY()

エラーメッセージに記載されているプロパティから、どのプロパティが不適合であるか、およびその理由(おそらくデータベース設定)を見つける必要があります。ほとんどの場合、データベースに設定された80の互換性レベルです。

アップデート。クエリ通知を正常に作成できると言っても、アプリケーション自体が失敗することを忘れないでください。アプリケーションは、接続時にこれらの設定の1つを明示的にオフに設定している必要があります(sys.dm_exec_sessionsを検査することで検証できます)。アプリケーションベンダーに連絡する必要があります。彼女は非常に明示的に(おそらく意図せずに)アプリケーションをクエリ通知と互換性がないようにしています。

于 2012-06-07T07:50:39.620 に答える