none
DataReader能获取存储过程的返回值吗? RRS feed

  • 问题

  • 数据库中有一个存储过程pGetRecordFromPage  返回值为@TotalRecord

                    sqlParmenters[0] = new SqlParameter("@TotalRecord", DbType.Int32);
                    sqlParmenters[0].Direction = ParameterDirection.Output;

                    IDataReader dataReader;
                    dataReader = DbHelper.ExecuteReader(CommandType.StoredProcedure, "pGetRecordFromPage", sqlParmenters);
                    recordCount = Convert.ToInt32(sqlParmenters[0].Value);  //数据总数

    这里sqlParmenters[0].Value 总是为0,如知道是怎么回事? 难道DataReader不能从数据库中获取存储过程的返回值吗?

    为何这样写是可以获取的,这里我不用DataReader,直接返回的是DataTable  为什么这样就可以获取获取存储过程的返回值sqlParmenters[0].Value

                    sqlParmenters[0] = new SqlParameter("@TotalRecord", DbType.Int32);
                    sqlParmenters[0].Direction = ParameterDirection.Output;

                    DataTable table = DbHelper.ExecuteDataTable(CommandType.StoredProcedure, "pGetRecordFromPage", sqlParmenters);
                    recordCount = Convert.ToInt32(sqlParmenters[0].Value);  //数据总数

    请高手能指点下吗? 非常感谢。

    2012年9月19日 10:18

答案

全部回复

  • 使用DataReader获取返回值,你要先关闭datareader,或者使用  dr.NextResult(); 才能获取返回值

    参照:http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/thread/79ffcef1-3757-405a-9ad4-8b4d2c609159/


    http://blog.csdn.net/zx13525079024

    • 已标记为答案 alenljw 2012年9月20日 8:10
    2012年9月20日 2:18
  • 楼主,我建议你:

    1)把返回值的变量写成output——这样定义:

    Create proc xxx
    ……
    @value output

    2)然后定义若干SqlParameter——针对value这个变量的Direction设置为Output,执行该存储过程,通过公共属性Value便可以获取数值了。


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月20日 3:16
  • 微软当年写的SqlHelper,这个类封装了很多方法的,由于字数限制没办法复制完整..可以上网搜一下

       /// <summary> 
            /// 将SqlParameter参数数组(参数值)分配给SqlCommand命令. 
            /// 这个方法将给任何一个参数分配DBNull.Value; 
            /// 该操作将阻止默认值的使用. 
            /// </summary> 
            /// <param name="command">命令名</param> 
            /// <param name="commandParameters">SqlParameters数组</param> 
            private static void AttachParameters(SqlCommand command, SqlParameter[] commandParameters)
            {
                if (command == null) throw new ArgumentNullException("command");
                if (commandParameters != null)
                {
                    foreach (SqlParameter p in commandParameters)
                    {
                        if (p != null)
                        {
                            // 检查未分配值的输出参数,将其分配以DBNull.Value. 
                            if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) &&
                                (p.Value == null))
                            {
                                p.Value = DBNull.Value;
                            }
                            command.Parameters.Add(p);
                        }
                    }
                }
            }
    
            /// <summary> 
            /// 将DataRow类型的列值分配到SqlParameter参数数组. 
            /// </summary> 
            /// <param name="commandParameters">要分配值的SqlParameter参数数组</param> 
            /// <param name="dataRow">将要分配给存储过程参数的DataRow</param> 
            private static void AssignParameterValues(SqlParameter[] commandParameters, DataRow dataRow)
            {
                if ((commandParameters == null) || (dataRow == null))
                {
                    return;
                }
    
                int i = 0;
                // 设置参数值 
                foreach (SqlParameter commandParameter in commandParameters)
                {
                    // 创建参数名称,如果不存在,只抛出一个异常. 
                    if (commandParameter.ParameterName == null ||
                        commandParameter.ParameterName.Length <= 1)
                        throw new Exception(
                            string.Format("请提供参数{0}一个有效的名称{1}.", i, commandParameter.ParameterName));
                    // 从dataRow的表中获取为参数数组中数组名称的列的索引. 
                    // 如果存在和参数名称相同的列,则将列值赋给当前名称的参数. 
                    if (dataRow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(1)) != -1)
                        commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)];
                    i++;
                }
            }
    
            /// <summary> 
            /// 将一个对象数组分配给SqlParameter参数数组. 
            /// </summary> 
            /// <param name="commandParameters">要分配值的SqlParameter参数数组</param> 
            /// <param name="parameterValues">将要分配给存储过程参数的对象数组</param> 
            private static void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
            {
                if ((commandParameters == null) || (parameterValues == null))
                {
                    return;
                }
    
                // 确保对象数组个数与参数个数匹配,如果不匹配,抛出一个异常. 
                if (commandParameters.Length != parameterValues.Length)
                {
                    throw new ArgumentException("参数值个数与参数不匹配.");
                }
    
                // 给参数赋值 
                for (int i = 0, j = commandParameters.Length; i < j; i++)
                {
                    // If the current array value derives from IDbDataParameter, then assign its Value property 
                    if (parameterValues[i] is IDbDataParameter)
                    {
                        IDbDataParameter paramInstance = (IDbDataParameter)parameterValues[i];
                        if (paramInstance.Value == null)
                        {
                            commandParameters[i].Value = DBNull.Value;
                        }
                        else
                        {
                            commandParameters[i].Value = paramInstance.Value;
                        }
                    }
                    else if (parameterValues[i] == null)
                    {
                        commandParameters[i].Value = DBNull.Value;
                    }
                    else
                    {
                        commandParameters[i].Value = parameterValues[i];
                    }
                }
            }
    
            /// <summary> 
            /// 预处理用户提供的命令,数据库连接/事务/命令类型/参数 
            /// </summary> 
            /// <param name="command">要处理的SqlCommand</param> 
            /// <param name="connection">数据库连接</param> 
            /// <param name="transaction">一个有效的事务或者是null值</param> 
            /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param> 
            /// <param name="commandText">存储过程名或都T-SQL命令文本</param> 
            /// <param name="commandParameters">和命令相关联的SqlParameter参数数组,如果没有参数为'null'</param> 
            /// <param name="mustCloseConnection"><c>true</c> 如果连接是打开的,则为true,其它情况下为false.</param> 
            private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, out bool mustCloseConnection)
            {
                if (command == null) throw new ArgumentNullException("command");
                if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");
    
                // If the provided connection is not open, we will open it 
                if (connection.State != ConnectionState.Open)
                {
                    mustCloseConnection = true;
                    connection.Open();
                }
                else
                {
                    mustCloseConnection = false;
                }
    
                // 给命令分配一个数据库连接. 
                command.Connection = connection;
    
                // 设置命令文本(存储过程名或SQL语句) 
                command.CommandText = commandText;
    
                // 分配事务 
                if (transaction != null)
                {
                    if (transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
                    command.Transaction = transaction;
                }
    
                // 设置命令类型. 
                command.CommandType = commandType;
    
                // 分配命令参数 
                if (commandParameters != null)
                {
                    AttachParameters(command, commandParameters);
                }
                return;
            }
    
            #endregion 私有构造函数和方法结束
    
            #region 数据库连接
            /// <summary> 
            /// 一个有效的数据库连接字符串 
            /// </summary> 
            /// <returns></returns> 
            public static string GetConnSting()
            {
                return "Max Pool Size = 512;user id=sa;Data Source=172.16.38.38;password=06xg130@;initial catalog=zymes";
                return ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
            }
            /// <summary> 
            /// 一个有效的数据库连接对象 
            /// </summary> 
            /// <returns></returns> 
            public static SqlConnection GetConnection()
            {
                SqlConnection Connection = new SqlConnection(SqlHelper.GetConnSting());
                return Connection;
            }
            #endregion
    
            #region ExecuteNonQuery命令
    
            /// <summary> 
            /// 执行指定连接字符串,类型的SqlCommand. 
            /// </summary> 
            /// <remarks> 
            /// 示例:  
            ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); 
            /// </remarks> 
            /// <param name="connectionString">一个有效的数据库连接字符串</param> 
            /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param> 
            /// <param name="commandText">存储过程名称或SQL语句</param> 
            /// <returns>返回命令影响的行数</returns> 
            public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText)
            {
                return ExecuteNonQuery(connectionString, commandType, commandText, (SqlParameter[])null);
            }
    
            /// <summary> 
            /// 执行指定连接字符串,类型的SqlCommand.如果没有提供参数,不返回结果. 
            /// </summary> 
            /// <remarks> 
            /// 示例:  
            ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 
            /// </remarks> 
            /// <param name="connectionString">一个有效的数据库连接字符串</param> 
            /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param> 
            /// <param name="commandText">存储过程名称或SQL语句</param> 
            /// <param name="commandParameters">SqlParameter参数数组</param> 
            /// <returns>返回命令影响的行数</returns> 
            public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
            {
                if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
    
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
    
                    return ExecuteNonQuery(connection, commandType, commandText, commandParameters);
                }
            }


    认真的活,认真的爱!


    2012年9月20日 7:36
    版主