2013-02-14 19 views
6

Ho una tabella e una dipendenza Sql in attesa di nuovi inserimenti.Ottenere dati da SqlDipendenza

OnChange genera gli incendi di cui ho bisogno, ma non capisco se è possibile ottenere la riga che causa la modifica del database.

SqlDependency comando SQL:

SqlCommand cmd = new SqlCommand("SELECT id FROM dbo.DataRequests", m_sqlConn); 

codice OnChange:

private void OnChange(object sender, SqlNotificationEventArgs e) 
{ 
    SqlDependency dependency = sender as SqlDependency; 

    dependency.OnChange -= OnChange; 

    Console.WriteLine("Info: " + e.Info.ToString()); 
    Console.WriteLine("Source: " + e.Source.ToString()); 
    Console.WriteLine("Type: " + e.Type.ToString()); 


    Console.WriteLine(DateTime.Now); 

    GetMessages(); 

} 
+0

La tua domanda è stata utile per trovare risposta alla mia domanda che è come trovare sorgente e le informazioni di eventi !! –

risposta

5

Non sono disponibili informazioni riguardo le righe che hanno causato la dipendenza da cuocere.

Immagino che come soluzione alternativa si possa sempre inserire un timestamp nei propri record e tenere traccia di quando è stato sparato l'ultimo evento.

+0

Come creare un timepstamp nel mio record e quindi inviare un filtro su timestamp con la mia stringa SQL per registrare una dipendenza? In questo modo verranno restituiti solo i record inseriti dopo un intervallo di tempo specificato. –

-1

Spero che questo ti aiuta:

 string commandString = string.Format("SELECT [Id] FROM [dbo].[Tech]"); 
    command = new SqlCommand(commandString, connection); 

    private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     SqlDependency dependency = (SqlDependency)sender; 
     dependency.OnChange -= dependency_OnChange; 

     this.Dispatcher.Invoke((System.Action)(() => 
     { 

      if (e.Info.ToString().ToLower().Trim() == "insert") 
      { 
       GetData(); 
       int NewTechID = TechIDs.Last(); 
      } 

     })); 
    } 

    private void GetData() 
    { 
     command.Notification = null; 
     SqlDependency dependency = new SqlDependency(command); 
     dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 

     command.Connection.Open(); 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       TechIDs.add(int.Parse(reader.GetValue(0).ToString())); 
      } 
      reader.Close(); 
     } 
     command.Connection.Close(); 
    } 
0

È possibile utilizzare le tabelle Temp. Prima di tutto è necessario creare una tabella temporanea con tutti i campi che è necessario tenere sotto osservazione. qualcosa di simile:

CREATE TABLE ##TempTab(
    [field1] [varchar](50) NULL, 
    [field2] [varchar](50) NULL 
} 

prega di notare che tipo di tabelle create all'interno Cose esterni sono caduto automaticamente in quanto il programma creatore si chiude in modo non è necessario farlo cadere sul FormClosing ... Ora, dopo aver configurato stoffe sqlDepency devi riempire la tua tabella temporanea, è qualcosa come un'istantanea dello scenario di partenza. Quindi, ogni volta che viene attivato l'evento onChange, è sufficiente confrontare la tabella temporanea con la situazione aggiornata. potrebbe essere qualcosa di simile:

select * from ##temptable left outer join mytable 
ON ##temptable.field1=myTable.field1 AND ##temptable.field2=myTable.field2 
WHERE myTable.field2 is null 

questo vi darà tutte le righe è stato appena cancellato (o chagend con vecchi valori). Dall'altra parte:

select * from mytable left outer join ##temptable 
    ON ##temptable.field1=myTable.field1 AND ##temptable.field2=myTable.field2 
    WHERE ##temptable.field2 is null 

vi darà tutte le righe è stato appena aggiunto (o modificati con i nuovi valori). Dopo aver confrontato devi solo aggiornare la tua tabella temporanea con nuovi valori (il modo più veloce è quello di eliminare tutto e inserire tutti i valori) Ovviamente, se il tuo programma verrà eseguito simultaneamente da diversi utenti, dovrai gestire userid all'interno tavolo temporaneo.

4

Date un'occhiata a questa componente: SqlTableDependency

Per ogni cambiamento fatto su una tabella di database di SQL Server, il codice C# accogliere un evento che contiene un elenco di record modificati.

1

trovare una soluzione molto ingegnosa here

Problemi correlati