我正在尝试构建一个负责数据库所有操作的类。
从这里使用单例模式:http: //codebender.denniland.com/a-singleton-base-class-to-implement-the-singleton-pattern-in-c/
我已经建立了一个像这样的类:
class DB : SingletonBase<DB>
{
public static readonly string SqlConnectionString = @"Data Source=MYDB;Initial Catalog=PRODUCTS;Integrated Security=True;Asynchronous Processing=true;";
private DB()
{
}
public void loadData()
{
SqlConnection conn = new SqlConnection(SqlConnectionString);
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "STATISTICS_1";
cmd.Connection = conn;
conn.Open();
IAsyncResult result = cmd.BeginExecuteReader(new AsyncCallback(HandleCallback), cmd, CommandBehavior.CloseConnection);
}
private void HandleCallback(IAsyncResult result)
{
SqlDataReader dr;
SqlCommand _this = (SqlCommand)result.AsyncState;
if (result.IsCompleted)
{
dr = _this.EndExecuteReader(result);
}
else
dr = null;
DataTable dt = new DataTable();
dt.Load(dr);
dr.Close();
MessageBox.Show("loaded");
}
}
在我的主要课程中,我像这样使用它:
private void loadStatistics(object sender, EventArgs e)
{
showStatus("loading data");
DB.Instance.loadData();
}
但这只会给我我的消息框。
我想做的是在我的主类中声明将在 SQL 查询返回某些内容后调用的函数。
我认为最好的方法是使用事件,但我不知道如何正确地做到这一点。
我想在我的主课上做这样的事情:
private void loadCompleted(string msg)
{
MessageBox.Show(msg);
}
private void loadStatistics(object sender, EventArgs e)
{
showStatus("loading data");
DB.Instance.loadData(loadCompleted);
}
这样我就可以指定将在 SQL 调用完成后调用的函数。
我不知道这是否是最好的方法,所以欢迎任何意见、建议和解决方案。
我想要实现的是让一个类负责异步调用 SQL 并将数据传递给将处理它的其他函数。