引发事件以更改表中的单元格值

时间:2018-09-27 07:10:22

标签: c# sql datatable dataset odbc

如果单元格的值已更改,我正在尝试引发一个事件。
来自.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();
    }

0 个答案:

没有答案