如果单元格的值已更改,我正在尝试引发一个事件。
来自.tps文件中。
到目前为止,我已经能够连接到通过odbc建立数据库,这对于使用该数据库的时代非常有用,而且我还能够使用SQL查询来获取所需的数据。
这是我的问题,我是希望当特定的一个或多个列单元格发生更改时能够引发事件。
我发现this for SQL,但是Odbc库似乎没有任何相似之处。
所以我想到的一种方法是有两个DataSet对象,如果第一个数据集对象为null,那么我们将所需的表加载到那里,并最终在一定时间后,< br />
如果第一个数据集不为空,则我们将第二个数据集设置为等于第一个数据集,然后从中清除前一个表,然后将新表加载到第一个数据集中。
从那里我们将运行此循环:
这是我的解决方法,可以肯定有一种更简单的方法没有这么大的开销。
/// <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++;
}
}
}
在上面的代码之前,我们首先需要获取数据,
所以我创建了它。
/// <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();
}