首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

asp.net(c#) 调用存储过程,获取输出参数和记录集解决办法

2012-02-03 
asp.net(c#) 调用存储过程,获取输出参数和记录集using(OleDbCommandcommnewOleDbCommand()){comm.Connect

asp.net(c#) 调用存储过程,获取输出参数和记录集
using   (OleDbCommand   comm   =   new   OleDbCommand())
                        {

                                comm.Connection   =   conn;
                                comm.CommandType   =   CommandType.StoredProcedure;
                                comm.CommandText   =   "p_getboardinfo ";
                                comm.Parameters.Add( "p_userid ",   OleDbType.VarChar,   40);
                                comm.Parameters[ "p_userid "].Value   =   null;
                                comm.Parameters.Add( "p_departid ",   OleDbType.VarChar,   40);
                                comm.Parameters[ "p_departid "].Value   =   0;
                                comm.Parameters.Add( "p_startpage ",   OleDbType.Numeric,   10);
                                comm.Parameters[ "p_startpage "].Value   =   1;
                                comm.Parameters.Add( "p_pagenum ",   OleDbType.Numeric,   10);
                                comm.Parameters[ "p_pagenum "].Value   =   3;
                                comm.Parameters.Add( "r_count ",   OleDbType.Numeric,   10);
                                comm.Parameters[ "r_count "].Direction   =   ParameterDirection.Output;
                                //comm.ExecuteNonQuery();
                                OleDbDataReader   dr   =   comm.ExecuteReader();                            

                                foreach   (OleDbParameter   parameter   in   comm.Parameters)
                                {
                                        Response.Write(string.Format( "参数名:{0},参数方向:{1},参数值:{2} <br/> ",   parameter.ParameterName,   parameter.Direction.ToString(),   parameter.Value));


                                }
问题一:首先用asp调用此存储过程,可以得到返回参数r_count   =   3,并得到记录集
说明存储过程正常!
但是用net   的   comm.ExecuteNonQuery()   执行,只能获取到参数,并且输出参数不正确,r_count   =1       ,获取不到记录集;

用net   的   OleDbDataReader   dr   =   comm.ExecuteReader()   可以获取到记录集,但是无法获得输出参数?

请教高手,如何处理?


问题二:
我在母版文件中   public   string   aaa   =   "43243 "   一个变量;
在内容页中,用master.aaa   获取变量的值,,在页面加载时,获取不到,而如果放到按钮点击事件中,就可以取到值
是不是页面加载的时候,先加载内容页面,再加载母版页面啊?不知道有什么办法可以解决这个问题!

在线等答案,如果分值不够,可以再加分!

[解决办法]
问题一:定义OleDbDataAdapter和DataSet,如
DataSet myDs=new DataSet();
myAdapter=new OracleDataAdapter(comm);
myAdapter.Fill(myDs, "infor ");
可以获得记录集
[解决办法]
/// <summary>
/// 执行存储过程返回一个记录集
/// </summary>
/// <param name= "StoredParam "> 存储过程名 </param>
/// <param name= "aryParm "> 参数数组 </param>
/// <returns> </returns>
public static DataSet ExecuteDsStoredParam(string StoredParam, SqlParameter[] aryParm)
{
try
{
SqlConnection Con=new SqlConnection(strCon);
SqlDataAdapter myAda = new SqlDataAdapter(StoredParam,Con);
myAda.SelectCommand.CommandType = CommandType.StoredProcedure;

foreach(SqlParameter parameter in aryParm)
{
myAda.SelectCommand.Parameters.Add(parameter);
}
Con.Open();
DataSet MyDs = new DataSet();
myAda.Fill(MyDs, "Temp ");

myAda.Dispose();
Con.Close();
Con.Dispose();

return MyDs;
}
catch(System.Data.SqlClient.SqlException ex)
{
throw new Exception (ex.Message);
}
}
[解决办法]
private DataSet ExecuteDataSet(SqlCommand Cmd)
{
try
{
SqlConnection Cn=Cmd.Connection;
SqlDataAdapter da=new SqlDataAdapter(Cmd);
DataSet ds=new DataSet();
da.Fill(ds);
Cn.Close();
return ds;
}
catch(System.Exception ex)
{
throw new Exception(ex.Message);
}
}
[解决办法]
/// 调用示例:
/// sql语句调用例子:
/// DataSet ds=ExecuteDataSet( "DELETE FROM testTable ");
/// 存储过程调用例子:
/// ArrayList Params=new ArrayList();
/// Params.Add(new SqlParameter( "@id ",80));
/// SqlParameter paramReturnValue=new SqlParameter( "RETURN_VALUE ",SqlDbType.Int);
/// paramReturnValue.Direction=ParameterDirection.ReturnValue;
/// Params.Add(paramReturnValue);
/// DataSet ds=ExecuteDataSet( "testProcedure ",Params);
public DataSet ExecuteDataSet(string sSql,CommandType TypeText,System.Collections.ICollection Params)
{

SqlCommand Cmd=this.InitlizeCmd(sSql,TypeText,Params,false);
return this.ExecuteDataSet(Cmd);
}

[解决办法]
/// <summary>
/// 根据sql语句出始化SqlCommand对象
/// </summary>
/// <param name= "sSql "> 要执行的sql语句 </param>
/// <param name= "TypeText "> 要执行的sql语句的类型 </param>


/// <param name= "Params "> 关连到sql语句的参数列表 </param>
/// <param name= "BTrans "> 是否使用交易 </param>
/// <returns> 一个根据sql语句出始化好的SqlCommand对象 </returns>
private SqlCommand InitlizeCmd(string sSql,CommandType TypeText,System.Collections.ICollection Params,bool BTrans)
{
try
{
SqlConnection Cn=this.GetConnection();
SqlCommand Cmd=new SqlCommand(sSql);
Cmd.CommandType=TypeText;
Cmd.Connection=Cn;
if(Params!=null)
{
Cmd=this.InitlizeCmdParamters(Cmd,Params);
}
if(this.DTDTransaction==true)
{
BTrans=false;
}
if(BTrans)
{
return InitlizeCmd(Cn,Cmd);
}
else
{
return Cmd;
}

}
catch(System.Exception ex)
{
throw new Exception(ex.Message);
}
}
[解决办法]
接上!!

/// <summary>
/// 出始化SqlCommand对象参数列表,把参数加入到SqlCommand对象
/// </summary>
/// <param name= "Cmd "> 一个已存在SqlCommand对象 </param>
/// <param name= "Params "> 要加入SqlCommand对象参数列表 </param>
/// <returns> 一个已加入参数的SqlCommand对象 </returns>
private SqlCommand InitlizeCmdParamters(SqlCommand Cmd,System.Collections.ICollection Params)
{
try
{
foreach(SqlParameter P in Params)
{
if(P.Direction==ParameterDirection.InputOutput || P.Direction==ParameterDirection.Output)
{
P.Value=null;
}
Cmd.Parameters.Add(P);
}
return Cmd;
}
catch
{
return Cmd;
}
}
[解决办法]
但是用net 的 comm.ExecuteNonQuery() 执行,只能获取到参数,并且输出参数不正确,r_count =1 ,获取不到记录集;

=======

ExecuteNonQuery() 目标 DML 语句是 Update/Delete/Insert 你说能取到数据集迈?

至于输出参数不对,那只有你自己跟踪调试了,假如确定存储过程无误,那么是不应该的!

int rowsAffected = comm.ExecuteNonQuery(); // 影响的行数
int r_coun = (int)comm.Parameters[ "r_count "].Value; // 输出参数


用net 的 OleDbDataReader dr = comm.ExecuteReader() 可以获取到记录集,但是无法获得输出参数?

========

对于 ExecuteReader 比较特殊, 你需要再关闭 DatarReader 获取调用 NextResult 之后才能获取输出参数

IDataReader dr = comm.ExecuteReader();
dr.Close(); // !!!!!!!!!!
// OR dr.NextResult();
int r_coun = (int)comm.Parameters[ "r_count "].Value; // 输出参数

[解决办法]
是不是页面加载的时候,先加载内容页面,再加载母版页面啊?不知道有什么办法可以解决这个问题!

==========

此问题,涉及 ASP.NET 页面/控件周期、事件顺序,目前暂时无法提供详细连接信息 ....

不过,通常的解决方案是,是将 master 的代码相对 aspx 中提升一个事件,
比如你要在 aspx 的 Load 中获取,那么 master 就再 Init 完成

注意:特定情况下,此法可能无效。

// .master
Page_Init(..
{
//...
}

// .aspx
Page_Load(..
{
//...
}

Hope helpful.
[解决办法]
SqlCommand command = new SqlCommand( "SampleProc ", connection);
command.CommandType = CommandType.StoredProcedure;

SqlParameter parameter = command.Parameters.Add(
"RETURN_VALUE ", SqlDbType.Int);
parameter.Direction = ParameterDirection.ReturnValue;

parameter = command.Parameters.Add(
"@InputParm ", SqlDbType.NVarChar, 12);
parameter.Value = "Sample Value ";



parameter = command.Parameters.Add(
"@OutputParm ", SqlDbType.NVarChar, 28);
parameter.Direction = ParameterDirection.Output;

connection.Open();

SqlDataReader reader = command.ExecuteReader();

Console.WriteLine(
"{0}, {1} ", reader.GetName(0), reader.GetName(1));

while (reader.Read())
{
Console.WriteLine(
"{0}, {1} ", reader.GetInt32(0), reader.GetString(1));
}

reader.Close();
connection.Close();

Console.WriteLine( " @OutputParm: {0} ", command.Parameters[ "@OutputParm "].Value);
Console.WriteLine( "RETURN_VALUE: {0} ", command.Parameters[ "RETURN_VALUE "].Value);

楼主试试这个方法哦
[解决办法]
帮顶
[解决办法]
用此方法取出的 出参为空啊?

========

假如是再调用了 DataReader.Close()/NextResult() 之后的就没有问题,一定能获取输出参数和返回值

也许你的 SP 真的有问题 ....

请仔细检查,跟踪调试 ....
[解决办法]
用NextResult() 不行

======

不可能吧,我做过测试的

在 ExcuteReader 中使用输出参数的问题
http://www.cnblogs.com/Jinglecat/archive/2006/08/17/479758.html


关于无法渠道正确值,你可以在存储过程中,显示的赋予一个固定值, 如果 911,然后测试

热点排行