C#asynch单例和委托内的SQL

我正在尝试构建一个负责数据库所有操作的类。

使用此处的单例模式: http : //codebender.denniland.com/a-singleton-base-class-to-implement-the-singleton-pattern-in-c/

我建了这样一个类:

class DB : SingletonBase { 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并将数据传递给将处理它的其他函数。

 public delegate void NotifyCallback(string message); public class ClassWithCommandAndCallback { public SqlCommand Sql; public NotifyCallback Callback; } public void loadData(NotifyCallback callback) { ClassWithCommandAndCallback ar = new ClassWithCommandAndCallback(); ar.Sql = cmd; ar.Callback = callback; IAsyncResult result = cmd.BeginExecuteReader(new AsyncCallback(HandleCallback), ar, CommandBehavior.CloseConnection); } private void HandleCallback(IAsyncResult result) { ClassWithCommandAndCallback ar = (ClassWithCommandAndCallback)result.AsyncState; ar.Callback("loaded (SQL was: "+ar.Sql+")"); }