c#outタイプパラメータ付きストレージプロシージャを呼び出す戻り値が得られない解決策

4675 ワード

普通の使い方で、出会ったことのない人はこの文章を見に来ませんが、出会って、検索して、理解して、書いてしまいました.
まず,outパラメータ付きタイプストレージプロセスをこう書く.
create procedure winne_Get_ProductsGuiGeFenYe
@pageSize int,
@pageNum int,
@total int output
as

select top (@pageSize) * from [productsGuiGe] where RowID not in(select top ((@pageNum-1)*@pageSize) rowID from dbo.ProductsGuiGe order by RowID) order by RowID;
set @total=(select count(1) from ProductsGuiGe);
 
  
                ,       。          ,         ,           ,    out      
   
  

c# , , SqlCommand.ExcuteNonQuery procedure, SqlCommand.ExcuteReader() , , : , , out @total null, 。 , 。

c#

 public static SqlDataReader EcuteReader(string sql, CommandType ctType, SqlParameter[] paras)
        {
            SqlConnection sqlcon = new SqlConnection(conString);

            sqlcon.Open();
            using (SqlCommand scmd = new SqlCommand(sql, sqlcon))
            {
                scmd.CommandType = ctType;
                if (paras.Length > 0)
                {
                    scmd.Parameters.AddRange(paras);
                }
                return scmd.ExecuteReader();


            }



        }

-----------------------------------------------------------------------------------------------------
  public SqlDataReader GetProductsTypesList(string sql,CommandType ctType,SqlParameter[] paras)
        {
            return SqlHelper.EcuteReader(sql, ctType, paras);

        }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        public List GetProductsTypesList(out int total,int pageSize,int pageNum)
        {
            ProductsDal pd = new ProductsDal();
           
            SqlParameter[] sp = new SqlParameter[3];
            sp[0]=new SqlParameter("@pageSize",SqlDbType.Int);
            sp[0].Value = pageSize;
            sp[1] = new SqlParameter("@pageNum", SqlDbType.Int);
            sp[1].Value = pageNum;
            sp[2] = new SqlParameter("@total", SqlDbType.Int);
            sp[2].Direction=ParameterDirection.Output;
            
            SqlDataReader sqldr = pd.GetProductsTypesList("winne_Get_ProductsGuiGeFenYe", CommandType.StoredProcedure, sp);
            List ProductsTypeList = new List();
            
            while (sqldr.Read())
            {
                ProductsType pt = new ProductsType();
                pt.RowId = int.Parse(sqldr["RowID"].ToString());
                pt.FatherName = sqldr["FatherName"].ToString();
                pt.TypeDanwei = sqldr["cp_danwei"].ToString();
                pt.TypeName = sqldr["GuiGeName"].ToString();
                pt.TypeID = sqldr["GuiGeID"].ToString();
                pt.Statue = sqldr["shenchan_status"].ToString();
                ProductsTypeList.Add(pt);
            }
            
            sqldr.Close();
            sqldr.Dispose();
            total = int.Parse(sp[2].Value.ToString());//  
            return ProductsTypeList;
        }

のコードは しい を ることができるので、コードと らし わせて、ポイントをまとめてみましょう.
1.まず、EcuteReaderを する は、コードセグメントに すSqlConnection sqlcon=new SqlConnection(conString)のように、SqlConnectionタイプの はusingでは できません. り sqldatareaderは み し に であるため, にデータベースを せに るため,この を いる があり,usingに れるとメソッド が てくると される.
2. の では、SqlDataReaderで に されたレコードを できることを しています.
3. はoutタイプのパラメータです.ExcuteReaderメソッドで されるSqlDataReaderがオフになってから、 が されるので、 が です.
 sqldr.Close();
sqldr.Dispose();
total = int.Parse(sp[2].Value.ToString());//  
3.                          , out        ,              ,    ,      ,      ,  ado.net     ,        ,  ,            
        ,            ,           ,         ,  。