c#outタイプパラメータ付きストレージプロシージャを呼び出す戻り値が得られない解決策
普通の使い方で、出会ったことのない人はこの文章を見に来ませんが、出会って、検索して、理解して、書いてしまいました.
まず,outパラメータ付きタイプストレージプロセスをこう書く.
まず,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 , , ,
, , , , 。