读书人

C#调用存储过程返回值为null不知道什

发布时间: 2012-03-08 13:30:13 作者: rapoo

C#调用存储过程返回值为null,不知道什么原因。
操作存储过程代码如下:
#region 数据库连接
/// <summary>
/// 打开数据库连接.
/// </summary>
private void Open()
{
// 打开数据库连接
if (con == null)
{
con = new SqlConnection(connectionString);
}
if (con.State == System.Data.ConnectionState.Closed)
con.Open();
}
/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
if (con != null)
con.Close();
}
/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{
// 确认连接是否已经关闭
if (con != null)
{
con.Dispose();
con = null;
}
}
#endregion

#region 存储过程操作
#region 准备存储过程参数
/// <summary>


/// 传入输入参数
/// </summary>
/// <param name= "ParamName "> 存储过程名称 </param>
/// <param name= "DbType "> 参数类型 </param> </param>
/// <param name= "Size "> 参数大小 </param>
/// <param name= "Value "> 参数值 </param>
/// <returns> 新的 parameter 对象 </returns>
public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
}
/// <summary>
/// 传入返回值参数
/// </summary>
/// <param name= "ParamName "> 存储过程名称 </param>
/// <param name= "DbType "> 参数类型 </param>
/// <param name= "Size "> 参数大小 </param>
/// <returns> 新的 parameter 对象 </returns>
public SqlParameter MakeOutParam(string ParamName, SqlDbType DbType, int Size)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.Output, null);
}
/// <summary>
/// 传入返回值参数
/// </summary>
/// <param name= "ParamName "> 存储过程名称 </param>
/// <param name= "DbType "> 参数类型 </param>
/// <param name= "Size "> 参数大小 </param>
/// <returns> 新的 parameter 对象 </returns>
public SqlParameter MakeReturnParam(string ParamName, SqlDbType DbType, int Size)
{


return MakeParam(ParamName, DbType, Size, ParameterDirection.ReturnValue, null);
}
/// <summary>
/// 生成存储过程参数
/// </summary>
/// <param name= "ParamName "> 存储过程名称 </param>
/// <param name= "DbType "> 参数类型 </param>
/// <param name= "Size "> 参数大小 </param>
/// <param name= "Direction "> 参数方向 </param>
/// <param name= "Value "> 参数值 </param>
/// <returns> 新的 parameter 对象 </returns>
public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)
{
SqlParameter param;
if (Size > 0)
param = new SqlParameter(ParamName, DbType, Size);
else
param = new SqlParameter(ParamName, DbType);
param.Direction = Direction;
if (!(Direction == ParameterDirection.Output && Value == null))
param.Value = Value;
return param;
}
#endregion

#region 执行存储过程
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name= "procName "> 存储过程的名称 </param>
/// <returns> 返回存储过程返回值 </returns>


public int RunProc(string procName)
{
SqlCommand cmd = CreateCommand(procName, null);
cmd.ExecuteNonQuery();
this.Close();
return (int)cmd.Parameters[ "ReturnValue "].Value;
}
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name= "procName "> 存储过程名称 </param>
/// <param name= "prams "> 存储过程所需参数 </param>
/// <returns> 返回存储过程返回值 </returns>
public int RunProc(string procName, SqlParameter[] prams)
{
SqlCommand cmd = CreateCommand(procName, prams);
cmd.ExecuteNonQuery();
this.Close();
return (int)cmd.Parameters[ "ReturnValue "].Value;
}
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name= "procName "> 存储过程的名称 </param>
/// <param name= "dataReader "> 返回存储过程返回值 </param>
public void RunProc(string procName, out SqlDataReader dataReader)
{
SqlCommand cmd = CreateCommand(procName, null);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
//return (int)cmd.Parameters[ "ReturnValue "].Value;
}
/// <summary>
/// 执行存储过程


/// </summary>
/// <param name= "procName "> 存储过程的名称 </param>
/// <param name= "prams "> 存储过程所需参数 </param>
/// <param name= "dataReader "> 存储过程所需参数 </param>
public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader)
{
SqlCommand cmd = CreateCommand(procName, prams);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
//return (int)cmd.Parameters[ "ReturnValue "].Value;
}
/// <summary>
/// 创建一个SqlCommand对象以此来执行存储过程
/// </summary>
/// <param name= "procName "> 存储过程的名称 </param>
/// <param name= "prams "> 存储过程所需参数 </param>
/// <returns> 返回SqlCommand对象 </returns>
private SqlCommand CreateCommand(string procName, SqlParameter[] prams)
{
// 确认打开连接
Open();
SqlCommand cmd = new SqlCommand(procName, con);
cmd.CommandType = CommandType.StoredProcedure;
// 依次把参数传入存储过程
if (prams != null)
{
foreach (SqlParameter parameter in prams)
cmd.Parameters.Add(parameter);
}
//// 加入返回参数
//cmd.Parameters.Add(


// new SqlParameter( "ReturnValue ", SqlDbType.Int, 4,
// ParameterDirection.ReturnValue, false, 0, 0,
// string.Empty, DataRowVersion.Default, null));
return cmd;
}
#endregion
#endregion


页面调用代码如下:
SqlDataReader dr = null;
DBHelper db = new DBHelper();
SqlParameter[] para ={
db.MakeInParam( "@PageIndex ",SqlDbType.Int,4,1000),
db.MakeInParam( "@PageSize ",SqlDbType.Int,4,50),
db.MakeInParam( "@strGetFields ",SqlDbType.NVarChar ,1000, "* "),
db.MakeInParam( "@tableName ",SqlDbType.NVarChar,500, "Comp_CarDatum "),
db.MakeInParam( "@ID ",SqlDbType.NVarChar,2000, "CCD_Guid "),
db.MakeInParam( "@strWhere ",SqlDbType.NVarChar,1000, " "),
db.MakeInParam( "@sortName ",SqlDbType.NVarChar,50, " CCD_Guid asc "),
db.MakeInParam( "@orderName ",SqlDbType.NVarChar,100, " "),
db.MakeOutParam( "@RecordCount ",SqlDbType.Int,4),
db.MakeOutParam( "@PageCount ",SqlDbType.Int,4)
};
db.RunProc( "sp_Page_Sql ", para, out dr);
SqlParameter dd=para[9];
Label1.Text = dd.Value.ToString();

按说上面执行后,我应该能取到输出参数第8个和第9个,但是返回全部为null
我在VS2003里一起这样用,移置到VS2005后,怎么也没有返回值。

[解决办法]
我也是碰到过这个问题,但是不知道怎么解决!
[解决办法]
我看老半天 ,但不知是不是这个问题 ::

SqlParameter dd=para[9]; //这里有问题


当做完foreach之后,我估计para[9]的和cmd.Parameters[9]的不再是同一个地址
foreach迭代出来的对象的改变不会更改原集合内容
if (prams != null)

{
foreach (SqlParameter parameter in prams)
cmd.Parameters.Add(parameter);
}

[解决办法]
用SELECT @Para1 ,@Para2 代替 Return 44~~
[解决办法]
存储过程有问题吧

还有 SqlParameter dd=para[9];
Label1.Text = dd.Value.ToString();
也是

读书人网 >C#

热点推荐