c# - schemas - sqldependency enable service broker
cómo mantener la dependencia sql haciendo su propósito (2)
El problema es en ausencia de resubscruption. Debería llamar al método de listen
dentro de OnDependencyChange
. Sé que es extraño, pero es la clase SqlDependency.
Tengo una aplicación de consola.
Quiero seguir viendo los cambios en una columna específica en la tabla de mi base de datos.
Leí en Internet y descubrí que la dependencia de sql es buena para mi propósito. Empecé a aprender sobre esto e hice lo siguiente:
- crear una clase.
- En el constructor, llamé a la función estática
start
y llamé a una función que tiene todas las configuraciones de dependencia sql.
Mi problema
Cuando ejecuto la aplicación usando el start
hago clic en Visual Studio 2013, las aplicaciones funcionan y luego se detienen. Sin embargo , lo que necesito es que las aplicaciones comiencen a funcionar y sigan vigilando los cambios en la tabla de mi base de datos.
¿Usted me podría ayudar por favor?
Código:
Este es un código c # muy simple.
public class MyListener
{
public MyListener()
{
SqlDependency.Start(getConnectionString());
this.listen();
}
private string getConnectionString()
{
return ConfigurationManager.ConnectionStrings["popup"].ConnectionString.ToString();
}
private void listen()
{
string query = "SELECT CallerID FROM TransferToSIP WHERE hasBeenRead = 0";
SqlConnection con = new SqlConnection(getConnectionString());
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
using (cmd)
{
SqlDependency dependency = new SqlDependency(cmd);
dependency.OnChange += new
OnChangeEventHandler(OnDependencyChange);
using (SqlDataReader reader = cmd.ExecuteReader())
{
}
}
}
void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
Console.WriteLine("Roma");
}
void Termination()
{
SqlDependency.Stop(getConnectionString());
Console.Read();
}
Tenga cuidado al usar la clase SqlDependency para monitorear los cambios en las tablas de la base de datos: tiene problemas con las pérdidas de memoria. Sin embargo, puede usar su propia realización con desencadenadores DDL y SQL Service Broker API o utilizar uno de los proyectos de código abierto, por ejemplo, SqlDependencyEx :
int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME))
{
sqlDependency.TableChanged += (o, e) => changesReceived++;
sqlDependency.Start();
// Make table changes.
MakeTableInsertDeleteChanges(changesCount);
// Wait a little bit to receive all changes.
Thread.Sleep(1000);
}
Assert.AreEqual(changesCount, changesReceived);
Espero que esto ayude.