Как сохранить несколько результатов из хранимой процедуры в наборе данных? - PullRequest
5 голосов
/ 15 марта 2011

Как объединить результирующие наборы из StoredProcedure в один набор данных в ASP.NET?

Ниже мой код в asp.net

SqlDataAdapter adap = new System.Data.SqlClient.SqlDataAdapter("sp_Home_MainBanner_TopStory",con);
adap.SelectCommand.CommandType = CommandType.StoredProcedure;
adap.SelectCommand.Parameters.AddWithValue("@rows", 9);

DataSet DS = new DataSet();

adap.Fill(DS, "Table1");
adap.Fill(DS, "Table2");

GridView1.DataSource = DS.Tables["Table2"];
GridView1.DataBind();

Даже если бы было два адаптера, как я могу объединить результаты в один набор данных?

Ответы [ 3 ]

16 голосов
/ 29 августа 2012

В MS SQL мы создаем процедуру вроде:

[ create proc procedureName
    as
    begin
        select * from student
        select * from test
        select * from admin
        select * from result
    end
]

В C# мы пишем следующий код для извлечения этих значений в DataSet

{
    SqlConnection sqlConn = new SqlConnection("data source=(local);initial catalog=bj001;user id=SA;password=bj");
    SqlCommand sqlCmd = new SqlCommand("procedureName", sqlConn);
    sqlCmd.CommandType = CommandType.StoredProcedure;
    sqlConn.Open();
    SqlDataAdapter sda = new SqlDataAdapter(sqlCmd);
    DataSet ds = new DataSet();
    sda.Fill(ds);
    sqlconn.Close();

    // Retrieving total stored tables from a common DataSet.              
    DataTable dt1 = ds.Tables[0];
    DataTable dt2 = ds.Tables[1];  
    DataTable dt3 = ds.Tables[2];
    DataTable dt4 = ds.Tables[3];  

    // To display all rows of a table, we use foreach loop for each DataTable.
    foreach (DataRow dr in dt1.Rows)
    {
        Console.WriteLine("Student Name: "+dr[sName]);
    }
}
1 голос
/ 27 апреля 2011

попробуйте использовать это:

adapter1.Fill(DS, "Table1, Table2");

это работает здесь так ...

1 голос
/ 26 апреля 2011

Набор данных содержит таблицы.В приведенном выше примере, если у вас было два SqlDataAdapter, каждый из которых вызывал хранимую процедуру и сохранял их так же, как вы это делали выше.

adapter1.Fill(DS, "Table1");
adapter2.Fill(DS, "Table2");

Это позволит получить результаты таблицы из первого запроса и сохранить их в DataSet DSкак Таблица1.Затем он будет хранить другую таблицу (Table2) в том же наборе данных.Для доступа к этим таблицам вы используете следующий код:

DS.Tables["Table1"]  //Or Table2, or whatever you name it during your Fill.

У вас уже есть правильный процесс, вам просто нужно посмотреть, как работает DataSet и решить, как вы хотите вызвать вашу информацию.

Однако, если вы хотите объединить свои результаты в одну таблицу данных, вам нужно будет перебирать таблицы и объединять информацию.

ex:
DataTable combinedTable = new DataTable();
//Create columns

foreach (DataRow row in DS.Tables["Table1"].Rows)
{
    //Create rows?  Copy information over?  Whatever you want to do.
}
...