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 を非同期的に呼び出し、それを処理する他の関数にデータを渡す役割を担う 1 つのクラスを持つことです。

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 に答える