Domanda

Ho uno SqlDependency creato utilizzando la seguente query:

string sql = "SELECT dbo.Case.CMRID, dbo.Case.SolutionID, dbo.Case.CreateDT, dbo.Case.ModifyDT "
+ "FROM dbo.Case "
+ "WHERE dbo.Case.ModifyDT > @LastExecutionDateTime";

L'esecuzione di questa query fa sì che l'evento OnChanged al fuoco continuamente con un tipo di non valido e Fonte di Dichiarazione . Quali Dopo ulteriori ricerche ho scoperto è ciò che accade quando le regole pause di query che sono le stesse regole per viste indicizzate dal momento che è ciò che questo meccanismo di notifica si basa su.

Verifica dei href="http://msdn.microsoft.com/en-us/library/aewzkxxh.aspx" rel="nofollow noreferrer"> Considerazioni particolari non vedo alcuna regola sto rompendo con questa affermazione.

Modifica della dichiarazione per

string sql = "SELECT dbo.Case.CMRID, dbo.Case.SolutionID, dbo.Case.CreateDT, dbo.Case.ModifyDT "
+ "FROM dbo.Case";
lavoro

non correttamente. L'evento OnChanged spara solo se del caso, e ha il tipo di set corretto.

Quindi, come posso restituire solo i record con una data di modifica dal mio ultimo esecuzione dell'istruzione?

È stato utile?

Soluzione

Che tipo è ModifyDT?

Il riferimento ADO.Net per QN è incompleta, l'elenco completo è nel riferimento SQL all'indirizzo Creazione di una query per la notifica . Le liste anche quest'ultimo il seguente:

  

La dichiarazione non deve avere il confronto   o l'espressione basata su doppia / reale   i tipi di dati.

Un altro problema potrebbe essere il cast da stringa a datetime che si verifica nella query, che può essere considerato non-deterministico (che è un criterio elencati sia ADO.Net e SQL spec). Provare a utilizzare un parametro digitato invece:. WHERE ModifyDT > @lastDateTime e passare un parametro di tipo DateTime

Altri suggerimenti

È a quanto pare hanno qualcosa che genera la data già in

  

LastExecutionDateTime

Quindi, piuttosto che creare uno SqlDependency sul SQL, utilizzare un oggetto SqlCommand

string sql = "SELECT CMRID, SolutionID, CreateDT, ModifyDT " + "FROM dbo.Case " + "WHERE ModifyDT > @lastExecutionDateTime"; 
//notice the parameter @lastExecutionDateTime, you cant use dates as a string, you also cant use something like CONVERT(datetime, '20040508'). You need a real date time object, hence the parameter

//You also only need to use the two part table ref (dbo.x) in the FROM clause, you dont need it on every field
//and while you didnt do it here, if anyone is interested a two part table ref in the form of dbo.[Case] would fail because the brackets will kill your dependency subscription

SqlCommand dependencyCommand= new SqlCommand(sql);
dependencyCommand.Parameters.Add(new SqlParameter("lastExecutionDateTime", SqlDbType.DateTime) {
        Value = LastExecutionDateTime 
    });

poi basta creare la dipendenza dal comando

//Create a dependency object and associate it with the SqlCommand.
SqlDependency dependency = new SqlDependency();
dependency.AddCommandDependency(dependencyCommand);
//Subscribe to the SqlDependency event.
dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);

ora ottenere il set di dati corrente e bastone nella memoria in modo da poter usare per confrontare contro una volta che i fuochi di dipendenza

//get the most recent data
DataTable currentDependencyData = new DataTable();
SqlDataAdapter dataAdapter = new SqlDataAdapter(dependencyCommand);
dataAdapter.Fill(currentDependencyData);

Se non l'hai già capito questo, il nome della tabella 3 parte che è il problema, provate in questo modo.

"SELECT [CMRID], 
       [SolutionID], 
       [CreateDT], 
       [ModifyDT] 
FROM [dbo].[Case] 
WHERE [ModifyDT] > " + LastExecutionDateTime;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top