Я пытаюсь вызвать событие, если значение ячейки изменилось.
из файла .tps .
Мне удалось подключиться кбаза данных через odbc , которая отлично подходит для базы данных ее возраста, и я также смог использовать запрос SQL, чтобы получить то, что мне нужно.
Вот моя проблема, янадеясь, что сможет вызвать событие, когда ячейка / ячейки определенного столбца изменились.
Я нашел этот для SQL, однако, похоже, что с библиотекой Odbc ничего подобного не происходит.
Итак, один из способов, которым я думал, было иметь два DataSet объекта, и если 1-й объект набора данных имеет значение null, то мы загрузим необходимую таблицу туда и, в конечном итоге, через определенный период,1018 *
если 1-й набор данных не был пустым, то мы установили бы 2-й набор данных равным 1-му, а затем загрузили бы новую таблицу в 1-й набор данных после очистки предыдущей таблицы от нее.
Оттуда мы запустим этот цикл:
Вот мой обходной путь, конечно, есть более простой способ без таких больших накладных расходов.
/// <summary>
/// Compare DataSet2 to DataSet1
/// </summary>
/// <param name="ds1">DataSet1</param>
/// <param name="ds2">DataSet2</param>
/// <param name="tableName">Tables Name</param>
/// <returns></returns>
private void CompareTables(string tableName, DataSet ds1, DataSet ds2)
{
int index = 0;
foreach (DataRow dw1 in ds1.Tables[tableName].Rows)
{
foreach (DataRow dw2 in ds2.Tables[tableName].Rows)
{
if (dw1.ToString() != dw1.ToString())
{
Console.Write(dw1.ToString());
Console.WriteLine(index);
SomethingHasChanged = true;
}
index++;
}
}
}
Прежде, чем вышеупомянутый код, нам сначала нужно получить данные,
Итак, я создалthis.
/// <summary>
/// Get the Tables Data.
/// </summary>
/// <param name="tableName">select your tables name.</param>
private void DownloadTable(string tableName)
{
using (OdbcConnection odbcConnection = new OdbcConnection(ConnectionString))
{
string DOWNLOAD_TABLE = "SELECT * FROM " + tableName;
if (OpenConnectionAsync(odbcConnection).Result)
{
if (DataSet1 == null)
{
OdbcCommand odbcCommand = new OdbcCommand(DOWNLOAD_TABLE, odbcConnection);
DataTable dataTable = new DataTable();
dataTable.Load(odbcCommand.ExecuteReader());
DataSet1 = new DataSet();
DataSet1.Tables.Add(dataTable);
}
else if (DataSet1 != null)
{
// DataSet 2 is now DataSet 1
DataSet2 = DataSet1;
OdbcCommand odbcCommand = new OdbcCommand(DOWNLOAD_TABLE, odbcConnection);
DataTable dataTable = new DataTable();
dataTable.Load(odbcCommand.ExecuteReader());
DataSet1.Clear();
DataSet1.Tables.Add(dataTable);
}
}
Console.WriteLine("Data Downloaded");
}
Следующая функция - это то, что я создал для запуска вышеуказанных событий.
private void WaitForChanges()
{
if (SomethingHasChanged)
{
// do something on change.
}
else
{
System.Threading.Thread.Sleep(TimeSpan.FromMinutes(5));
DownloadTable("foo");
}
}
И, наконец, вот конструктор и свойства, которые я использую
private DataSet DataSet1 { get; set; }
private DataSet DataSet2 { get; set; }
private Boolean SomethingHasChanged { get; set; }
private string ConnectionString { get; set; }
/// <summary>
/// Create A New DB Manager Object.
/// </summary>
/// <param name="connectionString"></param>
public DBManager(string connectionString = @"Dsn=pChoice_WDC;")
{
Task task = Task.Run(() =>
{
if (IsValidConnection(connectionString))
{
ConnectionString = connectionString;
}
else
{
throw new Exception("Connection String Error");
}
});
Task.WaitAny(task);
WaitForChanges();
}