Мне нужно подготовить программу, которая будет отправлять SMS при каждом сбое компьютера.Общая идея:
всякий раз, когда происходит сбой, добавляется новая запись в БД.Я слушаю его и отправляю в DataTable, который содержит строки с phone_number, типом crash (name) и line_number.Для каждой строки в этом DT я отправляю SMS.
Итак, у меня есть прослушиватель, который проверяет, была ли добавлена какая-либо новая строка в DBO.Это работает на удивление хорошо: D (класс: SqlDependencyEx).Вот метод, который я вызываю всякий раз, когда происходит изменение:
listener_andon_actions.TableChanged += (o, e) => SendToBuffer();
А вот общая идея метода SendToBuffer ():
SendToBuffer()
{
// connect to DB and put the data from query into DataTable. Then - put every row from this temporary DataTable to generalSMSBuffer
SqlConnection cnn;
cnn = new SqlConnection(connectionString);
string query = @"god_damn_long_query_here"
SqlCommand cmd = new SqlCommand(query, cnn);
// this last_id is used in query - to make sure I never grab for the same row twice :#
cmd.Parameters.AddWithValue("@last_id", lastID);
cnn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
//put query result into tempDB
da.Fill(tempDB);
// add data from temporary DataTable (it will always be just one row, but I use foreach anyways...) to a generalSMSBuffer
foreach (var row in tempDB.Rows)
{
generalSMSBuffer.Rows.Add(tempDB.Rows[i]["phone_number"], tempDB.Rows[i]["name"], tempDB.Rows[i]["line_number"]);
// set lastID like an ID of last row added to generalBuffer (mentioned before)
lastID = int.Parse(tempDB.Rows[i]["id"].ToString());
i++;
}
tempDB.Clear();
}
Хорошо, то, что я делаю дальше -каждый раз, когда в generalSMSBuffer добавляется новая строка (которая является DataTable), я вызываю событие:
protected void DataTable_RowChanged(object sender, DataRowChangeEventArgs e)
{
generalSMSBuffer = (DataTable)sender;
// only if a new row was ADDED
if (e.Action == DataRowAction.Add)
{
SendSMSesFromBuffer();
}
}
А вот метод SendSMSesFromBuffer ():
public void SendSMSesFromBuffer()
{
foreach (DataRow row in generalSMSBuffer.Rows)
{
// sending SMS - with AT Commands through SerialPort
SendSMS(row["phone_number"].ToString(), row["name"].ToString(), row["line_number"].ToString());
}
}
А вотпроблема: это будет работать (это на самом деле работает сейчас), но каждый раз, когда происходит новый сбой строки, он отправляет мне ВСЕ строки из таблицы данных GeneralSMSBuffer.
Полагаю, мне следует удалить строки из generalSMSBuffer после их отправки (у меня есть возможность установить sth как "флаг занятости" от отправителя SMS).
Как я могу сделать это, чтобы SMS-сообщения отправлялись только тогда, когда в буфере есть что-то?Должен ли я проверить это с помощью какого-нибудь таймера?
Этот метод SendSMSesFromBuffer () плохой preatty ... Я буду проходить по каждой строке каждый раз, когда добавляется новая строка ... Представьте себе ситуацию, когда20 новых сбоев добавляются в тот момент, когда я отправляю SMS ...
Возможно, вся идея ошибочна, и я не смогу осуществить ее без, например, нескольких потоков [*]
Много вещей, довольно сложно с моим объяснением, я думаю, но любые советы помогут мне ... Спасибо!