您的位置:首页 > 其它

ADO.NET2.0异步查询方法学习

2008-03-01 13:44 363 查看
public string ConStr = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;

protected void Page_Load(object sender, EventArgs e)

...{

if (!IsPostBack)

...{

BindData();

//BindMultiData();

//BindMultiDataArray();

//BindDataWithCallBack();

}

}

//异步查询的poll方式,最普通的方式

private void BindData()

...{

string QueryStr = "SELECT * FROM customers";

using (SqlConnection Con = new SqlConnection(ConStr))

...{

SqlCommand Cmd = new SqlCommand(QueryStr, Con);

IAsyncResult ASynResult;

SqlDataReader Da;

try

...{

Con.Open();

//begin方法返回一个IAsyncResult对象,用来检查执行是否完成

ASynResult = Cmd.BeginExecuteReader(CommandBehavior.CloseConnection);

while (!ASynResult.IsCompleted)

...{

Response.Write("异步查询</br>");

ASynResult.AsyncWaitHandle.WaitOne(3000, true);

//System.Threading.Thread.Sleep(10);

}

Da = Cmd.EndExecuteReader(ASynResult);

GridView1.DataSource = Da;

GridView1.DataBind();

}

catch (Exception ex)

...{

Response.Write(ex.Message);

}

}

}

//异步查询的wait方式,使用多个等待句柄来异步查询,必须等待所有进程完成处理结果集

private void BindMultiData()

...{

string CusQueryStr = "SELECT * FROM customers WHERE CompanyName = 'Alfreds Futterkiste'";

string SupQueryStr = "SELECT Customers.CompanyName, Customers.ContactName, " +

"Orders.OrderID, Orders.OrderDate, " +

"Orders.RequiredDate, Orders.ShippedDate " +

"FROM Orders, Customers " +

"WHERE Orders.CustomerID = Customers.CustomerID " +

"AND Customers.CompanyName = 'Alfreds Futterkiste' " +

"ORDER BY Customers.CompanyName, Customers.ContactName";

using (SqlConnection MyCon = new SqlConnection(ConStr))

...{

SqlCommand CusCmd = new SqlCommand(CusQueryStr, MyCon);

SqlCommand SupCmd = new SqlCommand(SupQueryStr, MyCon);

SqlDataReader CusDr;

SqlDataReader SupDr;

IAsyncResult CusIsynResult;

IAsyncResult SupIsynResult;

//创建句柄数组

System.Threading.WaitHandle[] WHandles = new System.Threading.WaitHandle[2];

System.Threading.WaitHandle CusHandle;

System.Threading.WaitHandle SupHandle;

MyCon.Open();

CusIsynResult = CusCmd.BeginExecuteReader(CommandBehavior.CloseConnection);

SupIsynResult = SupCmd.BeginExecuteReader(CommandBehavior.CloseConnection);

CusHandle = CusIsynResult.AsyncWaitHandle;

SupHandle = SupIsynResult.AsyncWaitHandle;

//将等待句柄赋给句柄数组

WHandles[0] = CusHandle;

WHandles[1] = SupHandle;

//将数组传给waitall方法,等待所以的异步查询完成

System.Threading.WaitHandle.WaitAll(WHandles);

CusDr = CusCmd.EndExecuteReader(CusIsynResult);

SupDr = SupCmd.EndExecuteReader(SupIsynResult);

GridView1.DataSource = CusDr;

GridView1.DataBind();

GridView2.DataSource = SupDr;

GridView2.DataBind();

MyCon.Dispose();

CusCmd.Dispose();

SupCmd.Dispose();

}

}

//采用WaitAny方式,优点是不用等待所有进程都完成才处理结果集

private void BindMultiDataArray()

...{

string CusQueryStr = "SELECT * FROM customers WHERE CompanyName = 'Alfreds Futterkiste'";

string SupQueryStr = "SELECT Customers.CompanyName, Customers.ContactName, " +

"Orders.OrderID, Orders.OrderDate, " +

"Orders.RequiredDate, Orders.ShippedDate " +

"FROM Orders, Customers " +

"WHERE Orders.CustomerID = Customers.CustomerID " +

"AND Customers.CompanyName = 'Alfreds Futterkiste' " +

"ORDER BY Customers.CompanyName, Customers.ContactName";

using (SqlConnection MyCon = new SqlConnection(ConStr))

...{

SqlCommand CusCmd = new SqlCommand(CusQueryStr, MyCon);

SqlCommand SupCmd = new SqlCommand(SupQueryStr, MyCon);

SqlDataReader CusDr;

SqlDataReader SupDr;

IAsyncResult CusIsynResult;

IAsyncResult SupIsynResult;

System.Threading.WaitHandle[] WHandles = new System.Threading.WaitHandle[2];

System.Threading.WaitHandle CusHandle;

System.Threading.WaitHandle SupHandle;

int WHindex;

MyCon.Open();

CusIsynResult = CusCmd.BeginExecuteReader(CommandBehavior.CloseConnection);

SupIsynResult = SupCmd.BeginExecuteReader(CommandBehavior.CloseConnection);

CusHandle = CusIsynResult.AsyncWaitHandle;

SupHandle = SupIsynResult.AsyncWaitHandle;

WHandles[0] = CusHandle;

WHandles[1] = SupHandle;

for (int i = 0; i < WHandles.Length; i++)

...{

//waitany好处在于不必等待所有异步操作完成

WHindex = System.Threading.WaitHandle.WaitAny(WHandles);

switch (WHindex)

...{

case 0:

CusDr = CusCmd.EndExecuteReader(CusIsynResult);

GridView1.DataSource = CusDr;

GridView1.DataBind();

break;

case 1:

SupDr = SupCmd.EndExecuteReader(SupIsynResult);

GridView2.DataSource = SupDr;

GridView2.DataBind();

break;

}

}

MyCon.Dispose();

CusCmd.Dispose();

SupCmd.Dispose();

}

}

//通过回调来实现异步查询

private void BindDataWithCallBack()

...{

string SupQueryStr = "SELECT Customers.CompanyName, Customers.ContactName, " +

"Orders.OrderID, Orders.OrderDate, " +

"Orders.RequiredDate, Orders.ShippedDate " +

"FROM Orders, Customers " +

"WHERE Orders.CustomerID = Customers.CustomerID " +

"AND Customers.CompanyName = 'Alfreds Futterkiste' " +

"ORDER BY Customers.CompanyName, Customers.ContactName";

using (SqlConnection MyCon = new SqlConnection(ConStr))

...{

SqlCommand SupCmd = new SqlCommand(SupQueryStr, MyCon);

SqlDataReader SupDr;

IAsyncResult SupIsynResult;

MyCon.Open();

AsyncCallback Callback = new AsyncCallback(CallBackMethod);

SupIsynResult = SupCmd.BeginExecuteReader(Callback, SupCmd,CommandBehavior.CloseConnection);

System.Threading.Thread.Sleep(100);

MyCon.Dispose();

SupCmd.Dispose();

}

}

//回调方法

public void CallBackMethod(IAsyncResult IResult)

...{

SqlCommand Command = (SqlCommand)IResult.AsyncState;

SqlDataReader dr = Command.EndExecuteReader(IResult);

GridView1.DataSource = dr;

GridView1.DataBind();

}

}

本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/html/adonet/1713241149778_2.html

永不言败:高级程序员,网站架构师。从事软件开发多年,,承接B/S架构相关项目。有意者请联系QQ:20028205
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐