2010-11-18 3 views
1

У меня есть хранимая процедура в SQL Server, которая возвращает семь наборов результатов. Я хотел бы вызвать эту хранимую процедуру из ASP.NET и заполнить семь GridViews на моей странице ASP.NET с результатами. Я использую 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 вы должны окружить свой SqlConnection оператором using. – Lareau

+0

@ Laraeu - это не имело никакого значения, я все равно получаю 'Неверная попытка вызвать HasRows, когда читатель закрыт. ' –

+0

Я видел проблемы, которые у вас были в комментариях к ответу. Я бы подумал об изменении параметров MultipleResults, чтобы принять sqlconnection таким образом, чтобы вы могли эффективно управлять открытием и закрытием. – Lareau

ответ

1

Вам необходимо использовать .NextResult() method вашего DataReader для перехода от первого набора результатов к следующему. Метод возвращает True, если в вашем наборе есть больше результатов, или False, если больше наборов результатов не существует.

После вызова .NextResult() вы можете привязать свой GridView к текущему набору результатов.

Ваш код может выглядеть следующим образом:

SqlDataReader dr = DB.CheckDBIntegrity(); 

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

Я обновил свой код в своей анкете, и я получаю эту ошибку: «Неверная попытка вызвать HasRows, когда читатель закрыт». Это сбивает с толку. –

+0

@Mark: это потому, что вы закрыли соединение с базой данных, прежде чем будете читать/использовать данные в datareader. – Jazza

+0

Я удалил con.Close() из метода MultipleResults, но получаю ту же ошибку: 'Неверная попытка вызвать HasRows, когда читатель закрыт.' –

4

Вы должны использовать DataSet, который может иметь несколько таблиц, которые будут связаны с вашим GridViews.

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

+0

спасибо за решение.Я старался держаться подальше от наборов данных из-за более низкой производительности по сравнению с SqlDataReader. Однако, если я не могу заставить решение SqlDataReader работать, мне, возможно, придется использовать DataSet. Спасибо за ответ. –

+0

Марк, я добавил ссылку на мой ответ, проверьте, поможет ли вам это немного. – Arief

Смежные вопросы