`
lovexuwenhao
  • 浏览: 199515 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于sqlhelper调用存储过程和获取参数返回值

阅读更多

SQLHelper类给我们操作数据库提供了便利,有些人说,SqlHelper类运行存储过程无法获取参数的返回值,这个认识是错误的。

SqlHelper类调用存储过程的方法有下面类似的两种类型:
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)

很多人没注意到第一种调用方法是能运行存储过程的,认为commandText参数只是传递sql命令,其实当CommandType 是存储过程的时候,commandText可以是存储过程的名字,看看SqlHelper上的参数说明:
/// <param name="connectionString">A valid connection string for a SqlConnection</param>
        /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
        /// <param name="commandText">The stored procedure name or T-SQL command</param>
        /// <param name="commandParameters">An array of SqlParamters used to execute the command</param>
        /// <returns>An int representing the number of rows affected by the command</returns>
我开始也是没注意这个问题,后来翻看它的源码才注意到了,前面尝试调用第二方法来获取返回值,其实这是无法获取的。第二种调用说明上已经清楚的指出了不能获取参数的返回值。
/// <remarks>
        /// This method provides no access to output parameters or the stored procedure's return value parameter.
仔细看的里面的实现将会发现:
它调用了:GetSpParameterSet(connection, spName, false);
接着调用:GetSpParameterSetInternal(clonedConnection, spName, includeReturnValueParameter);
在GetSpParameterSetInternal里面有这样的判断:
string hashKey = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter":"");很显然没有返回值,然后在DiscoverSpParameterSet方法内通过

if (!includeReturnValueParameter)
    {
                cmd.Parameters.RemoveAt(0);//由于自动检测参数时, 会在参数列表的首项加入@Return_Value.如果不需要它时,就要移去
    }
消除返回参数。其实由于第二种方法传递的是object类型的数据进去,根本就没有把需要返回参数返回值这种信息传递进去,程序无法知道你是不是需要返回 参数的值。而且object类型是值类型,函数内改变它的值也带不回来。之所以会有第二种调用方法是为了我们能更方便的调用存储过程,不必去关系存储过程 参数名是什么,知道它的参数顺序就可以了,它主要是利用SqlCommandBuilder.DeriveParameters(cmd);来获取参数信 息的,利用hashtable保存了Parameters。(为什么要用hashtable来保存,不保存应该也可以行的通的,还是从hashtable 里才clone一份Parameters出来用的。用静态的hashtable存储了最近一次调用的SqlParameter ,如果下次还是同一次调用,速度会快一些,不用去SqlCommandBuilder.DeriveParameters了,少连一次数据库)第一种方法 显然是要麻烦很多,要创建
SqlParameter 对象,还要注意存储过程参数名称等问题。下面是第一种方法调用例子:
string name;
        SqlParameter [] para=new SqlParameter[2];
        para[0]=new SqlParameter("@yhm","adm");
        para[1]=new SqlParameter("@name",SqlDbType.VarChar,100);
        para[1].Direction=ParameterDirection.Output;
        SqlHelper.ExecuteNonQuery(ConfigString.connectString, CommandType.StoredProcedure, "up_getUserName", para);
        name = para[1].Value.ToString();
        Response.Write(name);

其实很简单,只是我们没注意而已。sqlhelper内使用SqlConnection参数调用的 话,将会根据SqlConnection的状态来决定sqlhelper关不关闭SqlConnection。如果SqlConnection在传入的时 候是关闭的,那么sqlhelper会自己打开自己关闭;否则sqlhelper不会处理SqlConnection。

分享到:
评论

相关推荐

    使用SQLHelper类调用带输出、返回参数的存储过程

    使用`SQLHelper`类调用存储过程时,需要正确处理这些参数,尤其是输出参数和返回值。 #### 2.1 使用SqlParameter数组传递参数 `SQLHelper`类提供了多个重载方法来执行存储过程,其中一个关键方法是接受`Sql...

    访问数据库的SqlHelper文件,一个存储过程的,一个sql语句的

    使用SqlHelper调用存储过程,可以提高性能,因为它们在首次执行时会被编译成执行计划,后续调用则直接使用该计划。存储过程还可以提供更好的安全性,通过权限控制,限制对特定表的直接访问。在SqlHelper中调用存储...

    SqlHelper.zip

    3. **执行存储过程**:提供ExecuteReader、ExecuteNonQuery以及ExecuteScalar方法,分别用于执行存储过程并获取DataReader、受影响的行数或单个返回值。 4. **参数化处理**:SqlHelper支持参数化查询,避免了SQL...

    调用存储过程另一种方法

    第二种方法则通过`SqlConnection`和`SqlCommand`对象来调用存储过程。首先,我们需要创建一个数据库连接,然后创建一个`SqlCommand`对象,指定存储过程的名称,并设置`CommandType`为`CommandType.StoredProcedure`...

    SqlHelper源码及使用实例.

    - 如何使用SqlHelper执行不同的数据库操作,包括非查询、查询、获取单一值和调用存储过程。 - 存储过程的优势及其在SqlHelper中的应用。 通过实际运行这些示例,你将更好地理解SqlHelper的工作机制,并能够将其应用...

    SqlHelper源码及使用实例

    5. **ExecuteProcedure()**:用于调用存储过程,并根据存储过程的返回值类型返回适当的值。 在压缩包的文件列表中,我们可以看到以下文件: - **ExcuteReader.aspx**:这个页面展示了如何使用SqlHelper的...

    SqlHelper.cs源码

    除了执行简单的SQL语句,SqlHelper还可以帮助调用存储过程。只需指定存储过程名,以及对应的输入、输出或返回参数,SqlHelper将处理参数映射和结果的检索。 7. **错误处理和异常处理**: 在执行数据库操作时,...

    sqlhelper示例

    本示例将详细介绍如何使用SQLHelper来调用存储过程,以及相关知识点。 首先,SQLHelper的核心功能在于提供了一种方便的方式来执行SQL命令。在C#编程中,我们通常会创建一个SqlConnection对象,打开连接,创建...

    ASP.NET 获取存储过程返回值的实现代码

    在ASP.NET中,获取存储过程的返回值是一个常见的任务,特别是在执行数据库操作时...通过这种方式,开发者可以在ASP.NET应用程序中方便地调用存储过程,并获取其返回的结果。这在处理复杂的数据库逻辑和事务时非常有用。

    微软SqlHelper类 中文版 中的方法及说明整理

    例如,在执行存储过程或参数化查询时,可以利用该方法来设置参数值。 2. **AssignParameterValues 方法** - **定义**: ```csharp private static void AssignParameterValues(SqlParameter[] commandParameters...

    sqlhelper类代码

    6. **存储过程的支持**: 除了直接执行SQL语句,SqlHelper类通常也支持调用存储过程,可以传递参数并获取返回值。 7. **错误处理和异常处理**: 在执行数据库操作时,SqlHelper类通常会捕获可能出现的异常,并提供...

    SqlCeHelper +SqlHelper(WM开发专用^^)

    3. 存储过程调用:简化了存储过程的调用,可以传递参数并获取返回值。 4. 数据操作事务:支持在数据库事务中执行多条操作,确保数据的一致性。 5. 错误处理:内置异常处理机制,当数据库操作出错时,可以捕获并处理...

    SqlHelper.cs修改及使用

    ### SqlHelper.cs 修改及使用详解 #### 一、概述 `SqlHelper.cs`是一个与数据库交互的通用类,它封装了一系列用于操作数据库的方法,旨在简化应用程序中的数据库操作流程。通过这个类,开发者可以轻松实现数据库...

    sqlhelper代码类

    ### SQLHelper代码类知识点解析 ...通过封装这些操作,可以极大地简化应用程序的开发过程,并提高了代码的可维护性和可读性。开发者可以通过这个类快速地完成数据库相关的任务,而无需关注底层细节。

    SqlHelper(代码全).pdf

    在给定的代码片段中,`SqlHelper` 类实现了对SQL Server数据库的基本操作,并提供了对存储过程的支持。 1. **命名空间和导入的类**: - `System`: .NET框架的基础命名空间,包含许多基础类型。 - `System.Data`: ...

    mysqlhelper

    - **`RunProc`**:调用存储过程并返回其结果作为一个`DataSet`对象。 - **`RunProcNon`** 和 **`RunProcNonQuery`**:这两个方法用于执行不返回结果集的存储过程调用。 - **`RunProcT`**:执行存储过程并返回结果...

    C#操作SQL公共类

    这个方法接受四个参数:连接字符串、命令类型(如存储过程、T-SQL语句等)、命令文本(存储过程名称或T-SQL语句)和一个可变长度的SqlParameter数组,用于传递SQL命令的参数。在内部,方法首先创建并初始化...

    动态连接数据库代码文件

    SqlHelper通常采用参数化查询,有效防止SQL注入攻击,同时也支持存储过程的调用,提高了代码的可读性和维护性。 在使用这个sqlhelper文件时,你需要遵循以下步骤: 1. **导入库**:在你的项目中,首先需要引用包含...

    数据库的通用访问代码 asp.net(C#语言)

    // 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。 private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); /// ///执行一个不需要返回值的SqlCommand命令,通过...

Global site tag (gtag.js) - Google Analytics