I am trying to detect if any changes been made to SQL table I'm working with. I need to specify the search by selecting specific records only, and for this reason I need to use string parameter. I understand that according to this MSDN document:
The statement must not contain conditional statements that cannot change and cannot return results (for example, WHERE 1=0)
Is there any way to include string parameter when using SqlDependency?
If it means something, I use SQL Server 2012 and VS 2010
Here is my code so far.
Code output: "The above notification query is not valid.":
using System.Data;
using System.Data.SqlClient;
namespace AutoRegSession
{
    public partial class RoomActiveSession : Form
    {     
        public Timer timer = new Timer();         //Timer to measure update times
        public string SessionID;                  //String to hold selected sessionID
        string ConnStr = "Data Source=DUZY;Initial Catalog=AutoRegSQL;Integrated Security=True";    
        SqlDependency dependency;
        public RoomActiveSession()
        {
            SqlDependency.Start(ConnStr);
            InitializeComponent();
        }
        private void btn_Exit_Click(object sender, EventArgs e)
        {
            SqlDependency.Stop(ConnStr);
            timer.Enabled = false;  //Disable timer
            timer.Stop();           //Stop timer
            Application.Exit();     //Close application
        }
        //Check for table updates every 3 seconds
        private void timer_Tick(object sender, EventArgs e)
        {
            refreshDGV();
        }
        //SQL query that returns current/updated attendance result list for the given SessionID
        public void refreshDGV()
        {
            DataTable queryResult = new DataTable();   
            SqlConnection MyConn = new SqlConnection(ConnStr);      //Use connection string
            string query = @"SELECT TagID, SessionID, ScanningTime" +
               " FROM Attendance " +
               " WHERE SessionID = @SessionID ";
            SqlCommand command = new SqlCommand(query, MyConn);                             
            command.Parameters.Add("SessionID", SqlDbType.Char).Value = SessionID;    
            //Create a dependency and associate it with the SqlCommand
            SqlDependency dependency = new SqlDependency(command);
            //Subscribe to the SqlDependency event
            dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
            SqlDataAdapter adapter = new SqlDataAdapter(command);                           
            adapter.Fill(queryResult);                                                      
            DGVSetDataSouce(queryResult);                                                   
        }
        //Handler method for SQL Dependecy
        private void OnDependencyChange(object sender, SqlNotificationEventArgs eventArgs)
        {
            if (eventArgs.Info == SqlNotificationInfo.Invalid)
            {
                MessageBox.Show("The above notification query is not valid.");
            }
            else
            {
                MessageBox.Show("Notification Info: " + eventArgs.Info);
                MessageBox.Show("Notification source: " + eventArgs.Source);
                MessageBox.Show("Notification type: " + eventArgs.Type);
            }
        }
        //Create and start the timer
        public void SetTimer()
        {
            timer.Interval = 3000;
            timer.Tick += new EventHandler(timer_Tick);
            timer.Enabled = true;
            timer.Start();
        }
    }
}
                It should Work.
Problem might be you have not specified two part names for the table n SQL query.
The projected columns in the SELECT statement must be explicitly stated, and table names must be qualified with two-part names.
It only says it doesn't work when there is a where clause that cant return results under any scenario.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With