【发布时间】:2012-09-13 14:40:45
【问题描述】:
我正在尝试构建一个负责数据库所有操作的类。
从这里使用单例模式: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 调用完成后调用的函数。
我不知道这是否是最好的方法,所以欢迎任何 cmets、建议和解决方案。
我想要实现的是让一个类负责异步调用 SQL 并将数据传递给将处理它的其他函数。
【问题讨论】:
-
你看过代表吗?
-
顺便说一句:单身是邪恶的:c2.com/cgi/wiki?SingletonsAreEvil
-
是的,我知道我可以使用委托,但我在尝试时遇到了问题。我也想知道我的想法好不好。我应该使用单例以及如何从中调用方法。当我调用
BeginExecuteReader时,我必须以某种方式传递在执行 sql 后必须调用的函数名称。其背后的想法是能够调用 10 个查询到 sql server 以便它们都将执行。
标签: c# asynchronous