我有一个使用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);
}
}
答案 0 :(得分:1)
如果你想做得很好,你应该创建一个数据访问层,公开获取数据并修改数据的方法。只要有必要,该层就会打开一个连接,然后关闭它。您可以在其上添加缓存层。而您的GUI只会使用较低层的数据对象。
这不是一个小的重写,所以如果你当前的解决方案有效,并且你不想付出太多努力,那么就这样离开它,它并没有那么糟糕。如果它是一个简单的程序,那么这个简单的解决方案就可以了。