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

2023-12-11 07:58

本文主要是介绍关于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调用存储过程和获取参数返回值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/479992

相关文章

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.