2

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

从这里使用单例模式: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 并将数据传递给将处理它的其他函数。

4

1 回答 1

1
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+")");
}
于 2012-09-13T14:47:43.990 回答