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`类调用存储过程时,需要正确处理这些参数,尤其是输出参数和返回值。 #### 2.1 使用SqlParameter数组传递参数 `SQLHelper`类提供了多个重载方法来执行存储过程,其中一个关键方法是接受`Sql...
使用SqlHelper调用存储过程,可以提高性能,因为它们在首次执行时会被编译成执行计划,后续调用则直接使用该计划。存储过程还可以提供更好的安全性,通过权限控制,限制对特定表的直接访问。在SqlHelper中调用存储...
3. **执行存储过程**:提供ExecuteReader、ExecuteNonQuery以及ExecuteScalar方法,分别用于执行存储过程并获取DataReader、受影响的行数或单个返回值。 4. **参数化处理**:SqlHelper支持参数化查询,避免了SQL...
第二种方法则通过`SqlConnection`和`SqlCommand`对象来调用存储过程。首先,我们需要创建一个数据库连接,然后创建一个`SqlCommand`对象,指定存储过程的名称,并设置`CommandType`为`CommandType.StoredProcedure`...
- 如何使用SqlHelper执行不同的数据库操作,包括非查询、查询、获取单一值和调用存储过程。 - 存储过程的优势及其在SqlHelper中的应用。 通过实际运行这些示例,你将更好地理解SqlHelper的工作机制,并能够将其应用...
5. **ExecuteProcedure()**:用于调用存储过程,并根据存储过程的返回值类型返回适当的值。 在压缩包的文件列表中,我们可以看到以下文件: - **ExcuteReader.aspx**:这个页面展示了如何使用SqlHelper的...
除了执行简单的SQL语句,SqlHelper还可以帮助调用存储过程。只需指定存储过程名,以及对应的输入、输出或返回参数,SqlHelper将处理参数映射和结果的检索。 7. **错误处理和异常处理**: 在执行数据库操作时,...
本示例将详细介绍如何使用SQLHelper来调用存储过程,以及相关知识点。 首先,SQLHelper的核心功能在于提供了一种方便的方式来执行SQL命令。在C#编程中,我们通常会创建一个SqlConnection对象,打开连接,创建...
在ASP.NET中,获取存储过程的返回值是一个常见的任务,特别是在执行数据库操作时...通过这种方式,开发者可以在ASP.NET应用程序中方便地调用存储过程,并获取其返回的结果。这在处理复杂的数据库逻辑和事务时非常有用。
例如,在执行存储过程或参数化查询时,可以利用该方法来设置参数值。 2. **AssignParameterValues 方法** - **定义**: ```csharp private static void AssignParameterValues(SqlParameter[] commandParameters...
6. **存储过程的支持**: 除了直接执行SQL语句,SqlHelper类通常也支持调用存储过程,可以传递参数并获取返回值。 7. **错误处理和异常处理**: 在执行数据库操作时,SqlHelper类通常会捕获可能出现的异常,并提供...
3. 存储过程调用:简化了存储过程的调用,可以传递参数并获取返回值。 4. 数据操作事务:支持在数据库事务中执行多条操作,确保数据的一致性。 5. 错误处理:内置异常处理机制,当数据库操作出错时,可以捕获并处理...
### SqlHelper.cs 修改及使用详解 #### 一、概述 `SqlHelper.cs`是一个与数据库交互的通用类,它封装了一系列用于操作数据库的方法,旨在简化应用程序中的数据库操作流程。通过这个类,开发者可以轻松实现数据库...
### SQLHelper代码类知识点解析 ...通过封装这些操作,可以极大地简化应用程序的开发过程,并提高了代码的可维护性和可读性。开发者可以通过这个类快速地完成数据库相关的任务,而无需关注底层细节。
在给定的代码片段中,`SqlHelper` 类实现了对SQL Server数据库的基本操作,并提供了对存储过程的支持。 1. **命名空间和导入的类**: - `System`: .NET框架的基础命名空间,包含许多基础类型。 - `System.Data`: ...
- **`RunProc`**:调用存储过程并返回其结果作为一个`DataSet`对象。 - **`RunProcNon`** 和 **`RunProcNonQuery`**:这两个方法用于执行不返回结果集的存储过程调用。 - **`RunProcT`**:执行存储过程并返回结果...
这个方法接受四个参数:连接字符串、命令类型(如存储过程、T-SQL语句等)、命令文本(存储过程名称或T-SQL语句)和一个可变长度的SqlParameter数组,用于传递SQL命令的参数。在内部,方法首先创建并初始化...
SqlHelper通常采用参数化查询,有效防止SQL注入攻击,同时也支持存储过程的调用,提高了代码的可读性和维护性。 在使用这个sqlhelper文件时,你需要遵循以下步骤: 1. **导入库**:在你的项目中,首先需要引用包含...
// 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。 private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); /// ///执行一个不需要返回值的SqlCommand命令,通过...