2010-11-18 89 views
1

我在SQL Server中有一个存储过程,它返回7个结果集。我想从ASP.NET调用这个存储过程,并在结果中填充ASP.NET页面上的七个GridViews。我正在使用SqlDataReader来获取数据,但是我正在努力使用C#代码来填充GridViews。如何从一个存储过程填充许多GridView控件?

我创建了一个DAL类来获取数据,我在那里有这个方法:

public SqlDataReader CheckDataIntegrity() 
{ 
    SqlCommand cmd = new SqlCommand("cc.DataCheck"); 
    return MultipleResults(cmd); 
} 

辅助方法MultipleResults看起来是这样的:

private SqlDataReader MultipleResults(SqlCommand cmd) 
{ 
    SqlConnection con = new SqlConnection(_connectionString); 
    cmd.Connection = con; 

    con.Open(); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    con.Close(); 
    return dr; 

} 

我试图打电话我的页面上的组件类似于:

private void FillGridViews()   
{ 
    DBUtil DB = new DBUtil(); 
    using (SqlDataReader dr = DB.CheckDataIntegrity()) 
    { 
     if (dr.HasRows) 
     { 
      while (dr.Read()) 
      { 
       GridView1.DataSource = dr; 
       GridView1.DataBind(); 
      } 
     } 
    } 
} 

我在网上搜索了一个这个,但是找不到任何东西。

你知道一个资源,或有一个小例子来分享吗?

谢谢。

+0

在你的multipleResults方法中,你应该用using语句来包围你的SqlConnection。 – Lareau 2010-11-18 12:59:44

+0

@Laraeu - 这没有什么区别,我仍然无法尝试在阅读器关闭时调用HasRows。 – 2010-11-18 13:09:39

+0

我看到了您在答案评论中遇到的问题。我会考虑将MultipleResults的参数更改为接受sqlconnection,这样可以有效地管理打开和关闭。 – Lareau 2010-11-18 16:06:24

回答

1

您需要使用DataReader的.NextResult() method从第一个结果集前进到下一个结果集。如果您的集合中存在更多结果,则该方法返回True;如果没有更多结果集存在,则返回False。

调用.NextResult()后,您可以将GridView绑定到当前结果集。

您的代码可能是这样的:

SqlDataReader dr = DB.CheckDBIntegrity(); 

while (!dr.NextResult()) 
    { 
     // bind results to appropriate grid 
    } 
+0

我已经在我的问题中更新了我的代码,并且出现此错误:'当阅读器关闭时,尝试调用HasRows无效。 – 2010-11-18 12:39:26

+0

@Mark:这是因为在读取/使用数据读取器中的数据之前,您已关闭与数据库的连接。 – Jazza 2010-11-18 13:19:12

+0

我已经从MultipleResults方法中删除了con.Close(),但是我得到了同样的错误:'当关闭阅读器时,试图调用HasRows。' – 2010-11-18 13:33:55

4

您应该使用的数据集可以有多个表绑定到你的GridView的。

var dataset = GetDataSetForMy7GridViews(); 

// also valid: dataset.Tables["TableName"]; 
GridView1.DataSource = dataset.Tables[0]; 
GridView1.DataBind(); 

GridView2.DataSource = dataset.Tables[1]; 
GridView2.DataBind(); 

GridView3.DataSource = dataset.Tables[2]; 
GridView3.DataBind(); 

GridView4.DataSource = dataset.Tables[3]; 
GridView4.DataBind(); 

GridView5.DataSource = dataset.Tables[4]; 
GridView5.DataBind(); 

GridView6.DataSource = dataset.Tables[5]; 
GridView6.DataBind(); 

GridView7.DataSource = dataset.Tables[6]; 
GridView7.DataBind(); 

既然你绑定了7个不同的GridView,你需要这样做。如果你按照你的代码去做:

>    while (dr.Read()) 
>    { 
>     GridView1.DataSource = dr; 
>     GridView1.DataBind(); 
>    } 

它只会绑定到1个GridView。

新增: 也许这个链接是你的问题的答案? http://www.codeguru.com/csharp/csharp/cs_network/database/article.php/c8715

+0

这是正确的思想是最简单的,从我这里得到+1。 – Dal 2010-11-18 13:15:43

+0

感谢您的解决方案。我试图远离数据集,因为与SqlDataReader相比性能较低。但是,如果我不能让SqlDataReader解决方案工作,我可能不得不使用DataSet。谢谢回复。 – 2010-11-18 13:33:14

+0

马克,我添加了一个链接到我的答案,检查它,如果它可以帮助你一点。 – Arief 2010-11-18 14:00:45

相关问题