当前位置: 首页 > news >正文

通用数据访问类

`using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace self.xiketang.com.Ado.Net
{
public class SQLHelper
{
private static string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();

///


/// 执行增删改操作的方法
///

///
///
//public static int Update(string sql)
//{
// SqlConnection conn = new SqlConnection(connString);
// SqlCommand cmd = new SqlCommand(sql, conn);
// try
// {
// conn.Open();
// return cmd.ExecuteNonQuery();
// }
// catch (Exception ex)
// {
// //可以在这个地方捕获ex对象相关信息,然后保存到日志文件中...

// throw new Exception("执行方法public static int Update(string sql)发生异常:" + ex.Message);
// }
// finally //不管前面是否发生异常都要执行的代码
// {
// conn.Close();
// }
//}

///


/// 执行 增/删/改 (带参数,防SQL注入)
///

public static int Update(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connString))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
try
{
if (parameters != null)
{
cmd.Parameters.AddRange(parameters);
}

conn.Open();
return cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
// 这里可以写日志
throw new Exception("数据库操作失败:" + ex.Message);
}
}
}

///


/// 执行单一结果返回的查询方法
///

///
///
//public static object GetSingleResult(string sql)
//{
// SqlConnection conn = new SqlConnection(connString);
// SqlCommand cmd = new SqlCommand(sql, conn);
// try
// {
// conn.Open();
// return cmd.ExecuteScalar();
// }
// catch (Exception ex)
// {
// //可以在这个地方捕获ex对象相关信息,然后保存到日志文件中...

// throw new Exception("执行方法 public static object GetSingleResult(string sql)发生异常:" + ex.Message);
// }
// finally //不管前面是否发生异常都要执行的代码
// {
// conn.Close();
// }
//}

///


/// 执行查询,返回单个结果(如:Count、Max、Sum 等)
///

public static object GetSingleResult(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connString))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
try
{
// 有参数就加(防SQL注入)
if (parameters != null)
{
cmd.Parameters.AddRange(parameters);
}

conn.Open();
return cmd.ExecuteScalar();
}
catch (Exception ex)
{
// 可记录日志
throw new Exception("查询单个值失败:" + ex.Message);
}
}
}

///


/// 执行返回结果集的查询
///

///
///
//public static SqlDataReader GetReader(string sql)
//{
// SqlConnection conn = new SqlConnection(connString);
// SqlCommand cmd = new SqlCommand(sql, conn);
// try
// {
// conn.Open();
// //我们添加枚举CommandBehavior.CloseConnection之后,将来reader对象的链接会跟随reader对象的关闭自动关闭
// return cmd.ExecuteReader(CommandBehavior.CloseConnection);
// }
// catch (Exception ex)
// {
// //可以在这个地方捕获ex对象相关信息,然后保存到日志文件中...

// throw new Exception("执行方法 public static object GetSingleResult(string sql)发生异常:" + ex.Message);
// }
// //finally //在这个方法里面,绝对不能直接把链接关掉,否则出错
// //{
// // conn.Close();
// //}
//}

///


/// 执行查询,返回 SqlDataReader(只读、向前、快)
/// 注意:使用完必须 Close() 或 using 释放,会自动关闭连接
///

public static SqlDataReader GetReader(string sql, params SqlParameter[] parameters)
{
SqlConnection conn = new SqlConnection(connString);

try
{
conn.Open();

SqlCommand cmd = new SqlCommand(sql, conn);

// 加参数(防注入)
if (parameters != null)
{
cmd.Parameters.AddRange(parameters);
}

// 关键:CommandBehavior.CloseConnection → 释放 reader 时自动关闭连接
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
// 出错了必须把连接关掉!!!(原代码漏了这个)
conn.Close();

// 记日志
throw new Exception("获取DataReader失败:" + ex.Message);
}
}
}
}
`

http://www.rkmt.cn/news/1416528.html

相关文章:

  • 【系统学AI】07 ReAct范式:从奠基之作到Reflexion/RAF的演进
  • 微信聊天记录永久保存指南:用WeChatMsg打造你的数字记忆保险箱
  • 终极指南:如何在5分钟内为Windows微信/QQ/TIM安装防撤回补丁
  • 开发者必读:10个MiniCPM5-1B-MLX高效部署技巧与性能优化策略
  • 如何快速获取百度网盘真实下载地址:3步实现高速下载的完整指南
  • 田利建导演团队倾力护航《沿着边境看中国》第三季:融合真人秀元素,以匠心铸就边境新篇章
  • Claude可观测性盲区大起底:缺失的17个关键指标、5个不可替代的eBPF探针位置(附审计清单PDF)
  • CodeWF.Markdown:PDF 文本可复制、图片可嵌入,复制到公众号/知乎/掘金不再显示 HTML 源码
  • 猫抓插件完整指南:三步轻松掌控网页视频音频资源
  • DeepSeek多模态输出格式兼容方案(含OpenAI/Anthropic双协议映射表·限时公开)
  • 猫抓浏览器扩展:你的网页视频下载神器,三分钟告别在线观看限制
  • 终极指南:如何快速微调gbert-large-openmind适应你的德语领域特定任务 [特殊字符]
  • 终极指南:如何让百度网盘下载速度提升10倍?这个开源工具告诉你答案
  • 雀魂牌谱屋完整指南:三分钟搭建个人麻将数据分析中心
  • 微信聊天记录永久保存指南:如何用WeChatMsg打造你的数字记忆库
  • 开发者必看:Qwen2-7B的SFT与RLHF后训练最佳实践
  • Zotero终极指南:如何通过自定义排序规则打造高效的文献管理系统
  • FlexNet许可证服务器架构:单机与高可用对比
  • 从timedatectl到chrony:Linux时间同步服务选型与进阶配置指南(Ubuntu/CentOS实测)
  • Sora 2多模态协同工作流:文本→动态分镜→音效波形→字幕动效,1套打通AIGC短视频工业化链路
  • 如何永久保存微信聊天记录:开源工具让数据真正属于你
  • 【Claude消息队列架构白皮书】:20年分布式系统专家亲授高吞吐、低延迟、Exactly-Once语义落地的5大反模式与3层容错设计
  • buuctf [极客大挑战 2019 Knife]
  • 如何在3分钟内完成Honey Select 2的完整汉化与去码:终极技术配置指南
  • 闲置钻戒别蒙尘,北京合规门店无损鉴定,5 大门店实测 - 奢侈品回收测评
  • Arduino步进电机遥控小船:从硬件搭建到代码调试全流程实践
  • 基于ESP32与Flutter的厨房物联网环境监测系统全栈开发实践
  • Sapiens2性能优化指南:如何选择最适合你需求的模型参数规模
  • Chrome扩展开发实战:为Gemini打造高效对话管理器
  • Vibe Coding实战:无设计师打造Toss级UI的完整指南