在简单的WinForms应用程序中管理数据访问

时间:2010-12-25 07:00:28

标签: c# winforms sqlite datatable sqlconnection

我有一个使用SQLite的简单WinForms数据输入应用程序。它将永远是一个单用户应用程序,并始终与本地数据库。我有多个选项卡,UserControls用作选项卡的内容。每次选择一个选项卡时,都会初始化相应的UserControl,并删除旧的UserControl(使用TabPage.Controls.Remove)。

每个UserControl初始化一个通用DataAccess对象,该对象包装所有数据库内容,并可以与任何选项卡内容一起使用。问题是我在选项卡的生命周期内有一个开放的SQLiteConnection(UserControl)。我在别处读到这不是一个好习惯。我不想用精心设计的数据层和业务对象层来过度使用设计,部分原因是因为我不知道该怎么做,部分是因为我不认为这个应用程序是必要的。

我基本上在内存中保留相同的连接,适配器,DataTable,SqlCommand等对象,只是将它们与不同的sql查询参数一起使用,并使用其他方法(如RowCount)获取缓存数据。我有一个LoadData方法的问题,因为它没有从DataTable中清除以前的查询结果,所以我在开始时手动完成。

我试图找出一种方法来使用SQLiteConnection和其他对象“使用”,但是我必须重做整个DataLoad的东西或类似的东西,比如RowCount这样的简单东西。所以我只是在寻找有关数据访问方法的建议和意见。

以下是我的DataAccess类。

public class DataAccess
{
    private SQLiteConnection connection = new SQLiteConnection(Global.DbConnectionString);
    private DataTable dataTable = new DataTable();
    private SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter();
    private SQLiteCommandBuilder commandBuilder = new SQLiteCommandBuilder();
    private SQLiteCommand command = new SQLiteCommand();
    private BindingSource bindingSource = new BindingSource();


    public DataAccess()
    {
        dataAdapter.SelectCommand = command;
        commandBuilder.DataAdapter = dataAdapter;
        bindingSource.DataSource = dataTable;
    }

    ~DataAccess()
    {
        connection.Dispose();
    }

    public BindingSource BindingSource
    {
        get { return bindingSource; }
    }


    ///*
    public void LoadData(string sql, Dictionary<string, string> parameters)
    {
        try
        {
            dataTable.Clear();
            command.Connection = connection;

            // Ignore sql parameter if we already have CommandText. This assumes sql never changes per instance
            if (command.CommandText == null)
                command.CommandText = sql;

            foreach (KeyValuePair<string, string> parameter in parameters)
            {
                if (command.Parameters.Contains(parameter.Key))
                    command.Parameters[parameter.Key].Value = parameter.Value;
                else
                {
                    command.Parameters.Add(new SQLiteParameter(parameter.Key));
                    command.Parameters[parameter.Key].Value = parameter.Value;
                }
            }
            dataAdapter.Fill(dataTable);

        }
        catch (SqlException)
        {
            MessageBox.Show("Data Problem, need to display what's wrong later");
        }

    }//*/

    public int RowCount()
    {
        return dataTable.Rows.Count;
    }

    public string GetFieldValue(int row_index, string column_name)
    {
        return dataTable.Rows[row_index][column_name].ToString();
    }

    public void Save()
    {
        dataAdapter.Update(dataTable);
    }

    public void NewRow(Dictionary<string, string> fields)
    {
       DataRow dataRow = dataTable.NewRow();

        foreach (KeyValuePair<string, string> field in fields)
            dataRow[field.Key] = field.Value;

        dataTable.Rows.Add(dataRow);
    }
}

1 个答案:

答案 0 :(得分:1)

如果你想做得很好,你应该创建一个数据访问层,公开获取数据并修改数据的方法。只要有必要,该层就会打开一个连接,然后关闭它。您可以在其上添加缓存层。而您的GUI只会使用较低层的数据对象。

这不是一个小的重写,所以如果你当前的解决方案有效,并且你不想付出太多努力,那么就这样离开它,它并没有那么糟糕。如果它是一个简单的程序,那么这个简单的解决方案就可以了。