zoukankan      html  css  js  c++  java
  • 使用SQLHelper类调用带输出、返回参数的存储过程

    SqlHelper使用中需要注意的一点(带输出、返回参数的存储过程):

    SqlHelper中,在使用存储过程时候,如果你的存储过程参数中有输出、返回参数。有些函数是无法使用的。具体来说就是:

             SQLHelp 里面,如果传入的参数中有 params SqlParameter[] commandParameters 的那几个,是没问题的,有问题的是传入参数中有:params object[] parameterValues 的那几个:

    比如:
    public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)  这个没有提到的问题。

    这个
    public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
    有提到的问题。

    下面是有这些问题的函数列表:

    public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
    public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues)
    public static int ExecuteNonQuery(SqlTransaction transaction, string spName, params object[] parameterValues)

    public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues)
    public static DataSet ExecuteDataset(SqlConnection connection, string spName, params object[] parameterValues)
    public static DataSet ExecuteDataset(SqlTransaction transaction, string spName, params object[] parameterValues)

    public static SqlDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues)
    public static SqlDataReader ExecuteReader(SqlConnection connection, string spName, params object[] parameterValues)
    public static SqlDataReader ExecuteReader(SqlTransaction transaction, string spName, params object[] parameterValues)

    public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues)
    public static object ExecuteScalar(SqlConnection connection, string spName, params object[] parameterValues)
    public static object ExecuteScalar(SqlTransaction transaction, string spName, params object[] parameterValues)

    public static XmlReader ExecuteXmlReader(SqlConnection connection, string spName, params object[] parameterValues)
    public static XmlReader ExecuteXmlReader(SqlTransaction transaction, string spName, params object[] parameterValues)


    public static void FillDataset(string connectionString, string spName,
       DataSet dataSet, string[] tableNames,
       params object[] parameterValues)
    public static void FillDataset(SqlConnection connection, string spName,
       DataSet dataSet, string[] tableNames,
       params object[] parameterValues)
    public static void FillDataset(SqlTransaction transaction, string spName,
       DataSet dataSet, string[] tableNames,
       params object[] parameterValues)

     

    这里的类似函数的特征就是参数中,其中一个参数是:
    params object[] parameterValues

    如果你非要使用这些函数,你就会看到,你接收不到返回的存储过程输出、返回参数。

    原因:
          在这些函数的内部实现中,他把object[] parameterValues 转换为 SqlParameter[] commandParameters,而commandParameters 是个局部变量,在离开这个函数后,这些就无法再访问了。返回前,SqlHelper 并没有把commandParameters 的内容转赋给parameterValues 。所以之后你无法访问返回、输出参数的值。

    可以参看其中一个函数的实现:
    public static XmlReader ExecuteXmlReader(SqlConnection connection, string spName, params object[] parameterValues)
    {
         if( connection == null ) throw new ArgumentNullException( "connection" );
         if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );
         if ((parameterValues != null) && (parameterValues.Length > 0))
        {
              SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
              AssignParameterValues(commandParameters, parameterValues);
              return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters);
        }
        else
        {
              return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName);
        }
    }

            以前一直没有留意到这一点,前几天写的代码中,存储过程的参数老是无法返回.Debug的时候,一直没想是SqlHelper 这里的的情况,花了好长时间一直找不到问题所在,极度郁闷。太想当然了。Debug 的大部分时间都走了弯路。


  • 相关阅读:
    【sql:练习题3】查询在 SC 表存在成绩的学生信息
    【sql:练习题2】查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
    学习设计模式之动态代理
    学习设计模式之静态代理
    学习设计模式之装饰器模式
    学习设计模式之策略模式
    学习设计模式之简单工厂
    Ehcache3.x学习(二)分层的选项
    Ehcache3.x学习(一)入门
    java进行微信h5支付开发
  • 原文地址:https://www.cnblogs.com/chenbg2001/p/1761569.html
Copyright © 2011-2022 走看看