在SqlAdapter.Fill()期间即时修改值

时间:2010-05-05 04:24:05

标签: c# datatable globalization

通过SqlAdapter.Fill()将值加载到DataTable中时,正确修改值的正确方法是什么?

我已将应用程序的日志消息全球化了。指示与事件相关的事件类型和序列化数据的整数存储在数据库中,如下所示。当我通过DataGridView控件向用户显示记录的事件时,我将数据插入格式化字符串。

event_type event_timestamp     event_details
============================================
3          2010-05-04 20:49:58 jsmith
1          2010-05-04 20:50:42 jsmith
...

我目前正在迭代DataTable的行来格式化消息。

public class LogDataTable : DataTable
{
    public LogDataTable()
    {
        Locale = CultureInfo.CurrentCulture;
        Columns.AddRange(new DataColumn[] {
            new DataColumn("event_type", typeof(Int32)),
            new DataColumn("event_timestamp", typeof(DateTime)),
            new DataColumn("event_details", typeof(String))});
    }
}

...
using (SqlDataAdapter adapter = new SqlDataAdapter(...)) 
{
    adapter.SelectCommand.Parameters.AddRange(new Object[] {
       ...
    });
    adapter.Fill(table);
}
foreach (DataRow row in table.Rows)
{
    switch ((LogEventType)row["event_type"])
    {
       case LogEventType.Create:
           row["event_details"] = String.Format(Resources.Strings.LogEventCreateMsg, row["event_details"];
           break;
       case LogEventType.Create:
           row["event_details"] = String.Format(Resources.Strings.LogEventCreateMsg, row["event_details"];
           break;
       ...

显示的最终结果类似于:

Type   Date and Time       Details
====================================================================
[icon] 2010-05-04 20:49:58 Failed login attempt with username jsmith
[icon] 2010-05-04 20:50:42 Successful login with username jsmith
...

迭代结果集两次似乎很浪费 - 一旦表被适配器填充,再次执行替换。我真的想在我的LogDataTable类中进行动态替换,因为它正在填充。

我已尝试在LogDataTable中覆盖OnRowChanging方法,该方法会抛出InRowChangingEventException。

protected override void OnRowChanging(DataRowChangeEventArgs e)
{
    base.OnRowChanging(e);
    switch ((LogEventType)row["event_type"])
    ...

我试过覆盖一个OnRowChanged方法,该方法抛出一个StackOverflowException(我假设更改它会无限制地重新触发方法?)。

我已经尝试重写一个OnTableNewRow方法,该方法不会抛出异常但似乎没有被调用(我假设只有当用户在视图中添加一行时才会被阻止)。

我非常感谢任何人都能给予我的帮助。

1 个答案:

答案 0 :(得分:1)

IMO,你目前正在做的事情很好。您可以很好地更改内存中的DataTable项目,而不是动态更改它们,因为它可能会降低您的性能,因为它会中断IO操作。

另一方面,如果您是数据库管理员,您可以更好地ETL您的第一列:)