gpt4 book ai didi

单例和委托(delegate)中的 C# 异步 SQL

转载 作者:太空宇宙 更新时间:2023-11-03 13:55:22 25 4
gpt4 key购买 nike

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

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

最佳答案

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+")");
}

关于单例和委托(delegate)中的 C# 异步 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12408835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com