如何在不同的数据集中获取存储过程的批处理查询

时间:2012-02-16 18:06:48

标签: c# asp.net

我正在尝试从一个存储过程中获取单个页面中不同的不同数据集的所有数据。

CREATE PROCEDURE [dbo].[usp_Details](@status  int, @Id int)
AS
begin

Select u.Id,u.FName,u.ImageName,u.ImagePath,u.Sex FROM [User] as u
 where u.Id IN (SELECT MyId as Id FROM Friends WHERE FriendId=@Id AND FriendStatus=0)

Select Points,FName from [User] where Id=@Id

SELECT ImagePath from [User] where Id=@Id
end
GO

现在,我如何为单个查询绑定数据表/数据集。 示例:query1表示dataset1,query2表示dataset2,query3表示dataset3

如果无法做到这一点,那么每次获取不同表时,最好避免连接数据库。

3 个答案:

答案 0 :(得分:0)

不确定您是否可以使用数据集执行此操作,但您始终可以回退到较低的杠杆ADO.NET API。 SqlReader通过NextResult方法支持多个结果集。

答案 1 :(得分:0)

这是一种方式。

您可以轻松地移回DataTable数组,而无需将它们包装在DataSet中。从资源的角度来看更好,因为DataSet是一个非常重量级的类。 DataSet几乎是一个内存中的关系数据库,它为构建DataTables之间的关系和实施约束提供了各种支持。

根本不要求DataTable成为DataSet的一部分。它基本上只是一个容器。

以下是代码:

static DataSet[] ExecStoredProcedure()
{
  DataSet[] instance = null ;
  const string credentials = "Data Source=localhost;Initial Catalog=sandbox;Integrated Security=SSPI;" ;

  using ( SqlConnection  connection = new SqlConnection( credentials ) )
  using ( SqlCommand     command    = connection.CreateCommand() )
  using ( SqlDataAdapter adapter    = new SqlDataAdapter( command ) )
  using ( DataSet        results    = new DataSet() )
  {

    command.CommandType = CommandType.StoredProcedure ;
    command.CommandText = @"someStoredProcedure" ;

    connection.Open() ;
    adapter.Fill( results ) ;
    connection.Close() ;

    List<DataSet> list = new List<DataSet>( results.Tables.Count ) ;
    while ( results.Tables.Count > 0 )
    {
      DataTable dt = results.Tables[0] ;

      results.Tables.RemoveAt(0) ;

      DataSet ds = new DataSet() ;
      ds.Tables.Add( dt ) ;
      list.Add(ds) ;

    }

    instance = list.ToArray() ;

  }

  return instance ;
}

执行返回多个结果集的存储过程的另一个选项,将指定的结果集作为DataTable返回。达到所需的结果集时,存储过程的执行会短路:

static DataTable ExecStoredProcedure( string someStoredProcedure , int desiredTableNumber )
{
  DataTable instance = null ;
  const string credentials = "Data Source=localhost;Initial Catalog=sandbox;Integrated Security=SSPI;" ;

  using ( SqlConnection  connection = new SqlConnection( credentials ) )
  using ( SqlCommand     command    = connection.CreateCommand() )
  {

    command.CommandType = CommandType.StoredProcedure ;
    command.CommandText = someStoredProcedure ;

    connection.Open() ;

    using ( SqlDataReader reader = command.ExecuteReader() )
    {
      int i = 0 ;
      while ( reader.HasRows )
      {

        // toss any unwanted results ;
        if ( instance != null ) instance.Dispose() ; // toss unwanted results

        instance = new DataTable() ;
        instance.Load( reader ) ;

        if ( i == desiredTableNumber || reader.IsClosed ) break ;

        ++i ;

      }

      if ( i != desiredTableNumber )
      {
        if ( instance != null ) instance.Dispose() ;
        instance = null ;
      }

      // try to tidy up so the connection isn't hose, if we short-circuited execution
      command.Cancel() ;
      reader.Close() ;

    }

    command.Cancel() ;
    connection.Close() ;

  }

  return instance ;
}

答案 2 :(得分:0)

我得到了答案,但仍需要一个值得使用的建议。

private void GetMultiSelect()
{
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbConnect1"].ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = con;
            cmd.CommandText = "usp_AllDetail";
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter sqlParam = cmd.Parameters.Add("@Id", SqlDbType.Int, 4);
            sqlParam.Value = 1;
            //dataset object to get all select statement results
            DataSet ds = new DataSet();

            //sql dataadoptor to fill dataset
            using (SqlDataAdapter adp = new SqlDataAdapter(cmd))
            {
                //here all select statements are fill in dataset object
                adp.Fill(ds);

                //now u can fetch each and every select statement by providing table index in dataset

                foreach (DataTable dt in ds.Tables)
                {
                    //select statement result in dt..
                }

                //or instead of loop u can specify the index
               GridView1.DataSource= ds.Tables[1]; // first select statement result
               GridView1.DataBind();
               GridView2.DataSource = ds.Tables[0]; // second select statement result
               GridView2.DataBind();
            }
        }
    }
}