0

データベース ビューに対して SqlCommand を実行する次のコードがあります。

public IEnumerable<PickNote> GetData()
        {
            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["BTNInternalData_LiveEntities"].ConnectionString))
            {
                connection.Open();
                using (var command = new SqlCommand(@"SELECT [PICKINGROUTEID],[CUSTOMER],[SALESNAME]
           FROM [dbo].[PickScreenData] WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, [ACTIVATIONDATETIME])) = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) or [EXPEDITIONSTATUS] = 3", connection))
                {
                    // Make sure the command object does not already have
                    // a notification object associated with it.
                    command.Notification = null;

                    var dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                    if (connection.State == ConnectionState.Closed)
                        connection.Open();

                    using (var reader = command.ExecuteReader())
                    {
                        var data = reader.Cast<IDataRecord>();

                        return data.Select(x => new PickNote
                        {
                            pickingRouteId = x["PICKINGROUTEID"].ToString()
                        }).ToList();
                    }
                }
            }
        }

private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        // do stuff
    }

ただし、このdependency_OnChangeメソッドはアプリケーションの開始時にのみ呼び出され、View のデータが変更されても再度呼び出されることはありません。SqlNotificationEventArgs をデバッグしましたが、情報はありInvalidますが、コマンド クエリが正常に実行されるため、理由がわかりません

編集

テーブルを直接クエリするようにクエリを変更しましたが、SqlNotificationEventArgs.InfoそれでもInvalid. 新しいコードは次のとおりです。

public IEnumerable<PickNote> GetData()
    {
        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["AXLive"].ConnectionString))
        {
            connection.Open();
            using (var command = new SqlCommand(@"
                SELECT PICKINGROUTEID, EXPEDITIONSTATUS
                FROM         [dbo].[WMSPICKINGROUTE]
                WHERE     (EXPEDITIONSTATUS <> 20) 
                AND (DATEADD(dd, 0, DATEDIFF(dd, 0, [ACTIVATIONDATETIME])) = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
                    OR [EXPEDITIONSTATUS] = 3)", connection))
            {
                // Make sure the command object does not already have
                // a notification object associated with it.
                command.Notification = null;

                var dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                using (var reader = command.ExecuteReader())
                {
                    var data = reader.Cast<IDataRecord>();

                    return data.Select(x => new PickNote
                    {
                        pickingRouteId = x["PICKINGROUTEID"].ToString()
                    }).ToList();
                }
            }
        }
    }

WMSPICKINGROUTE私のビューが以前からデータを取得していたテーブルです。

4

1 に答える 1

1

この MSDNページによると、ビューを参照する select ステートメントに対して SqlDependency を使用することはできません。それが問題のようです。テーブルにヒットするようにクエリを書き直せば、うまくいくはずです。

于 2013-11-14T16:30:25.037 に答える