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

C#调用存储过程返回值为null,不知道什么原因。解决思路

2012-03-08 
C#调用存储过程返回值为null,不知道什么原因。操作存储过程代码如下:#region数据库连接///summary///打开

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();
也是

热点排行