SqlDependency query con clausola WHERE non ammessi. Come posso modificarlo per essere valido?
-
24-09-2019 - |
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?
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;