2015-02-27 2 views
0

Я написал службу Windows для одного из наших локальных серверов. Эта служба работает как драгоценный камень на моей локальной машине, делает то, что она должна (ACCP для обмена данными db), но я не слишком знаком с зависимостями. Является ли это подходящим способом структурирования программы?Sql Зависимость от сервисного брокера

string DBP3_US = DBP3_US; 
string PING_DEPENDENCY = "SELECT [SomeColumn] FROM [SomeTable];"; 

protected override void OnStart(string[] args) 
{ 
    SqlDependency.Start(DBP3_US); 
    Thread Ping_US = new Thread(PingThread); 
    Ping_US.Name = "ping_US"; 
    Ping_US.Start(); 
} 

private void PingThread() 
{ 
    CreateCommandWithDependency(PING_DEPENDENCY, Ping_OnChange); 
} 

private void CreateCommandWithDependency(string queryText, OnChangeEventHandler e, string db = DBP3_US) 
{ 
    using (SqlConnection con = new SqlConnection(db)) 
    using (SqlCommand cmd = con.CreateCommand()) 
    { 
     cmd.CommandText = queryText; 
     cmd.CommandType = CommandType.Text; 
     cmd.Notification = null; 
     SqlDependency sqlDep = new SqlDependency(cmd); 
     sqlDep.OnChange += new OnChangeEventHandler(e); 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
} 

private void Ping_OnChange(object sender, SqlNotificationEventArgs e) 
{ 
    PingDependency(); 
    Thread Ping_US = new Thread(PingThread); 
    Ping_US.Start(); 
} 

private void PingDependency(string db = DBP3_US) 
{ 
    // Do whatever operations are required. 
} 

ответ

0

Будьте осторожны при использовании SqlDependency класс для отслеживания изменений в таблицах базы данных - это имеет problems с утечками памяти. Однако вы можете использовать свою собственную реализацию с триггерами DDL и SQL Service Broker API или использовать один из проектов с открытым исходным кодом, например. 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); 

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^