以下代码是参考几个不同人的写法总结写成的,肯定还有很大的优化空间,暂存该版本;有建议的欢迎提出;

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace FirstBI
{
public abstract class SqlHelpertrain//定义为abstract抽象类,不能被实例化,在应用时直接调用
{
/*1.获取数据库连接字符串;
* 2.Connection 链接绑定,open/close;
* 3.实例化一个Command命令,给定命令执行的超时时间 ,命令执行的连接;命令的类型(增/删/改/查)
* ,是否带事务,执行用到哪些参数,还有最重要的命令执行的sql字符串;
* 4.SqlDataAdapter承接命令返回的结果集
*/
private static int TimeOut = ;
private static string connStrs = ConfigurationManager.ConnectionStrings["FirstBI.Properties.Settings.BaseERPConnectionString"].ConnectionString;
/// <summary>
/// 获取SqlCommand
/// </summary>
/// <param name="conn"></param>
/// <param name="cmdType"></param>
/// <param name="tran"></param>
/// <param name="sqlParams"></param>
/// <returns></returns>
public static SqlCommand GetSqlCommand(string sql, SqlConnection conn, CommandType cmdType, SqlTransaction tran, params SqlParameter[] sqlParams)
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.CommandTimeout = TimeOut;
cmd.CommandType = cmdType;
if (tran != null)
cmd.Transaction = tran;
if (sqlParams != null && sqlParams.Length > )
cmd.Parameters.AddRange(sqlParams);
return cmd;
}
/// <summary>
/// DataTable
/// </summary>
/// <param name="sql"></param>
/// <param name="cmdType"></param>
/// <param name="tran"></param>
/// <param name="sqlParams"></param>
/// <returns></returns>
public static DataTable GetDataTable(string sql, CommandType cmdType, SqlTransaction tran, params SqlParameter[] sqlParams)
{
using (SqlConnection conn = new SqlConnection(connStrs))
{
try
{
conn.Open();
using (SqlCommand cmd = GetSqlCommand(sql, conn, cmdType, tran, sqlParams))
{
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
} }
catch (SqlException ex)
{
StringBuilder log = new StringBuilder();
log.Append("查询数据错误:");
log.Append(ex);
throw new Exception(log.ToString());
}
finally
{
conn.Close();
}
}
}
/// <summary>
/// DataSet
/// </summary>
/// <param name="sql"></param>
/// <param name="cmdType"></param>
/// <param name="tran"></param>
/// <param name="sqlParams"></param>
/// <returns></returns>
public static DataSet GetDataSet(string sql, CommandType cmdType, SqlTransaction tran, params SqlParameter[] sqlParams)
{
using (SqlConnection conn = new SqlConnection(connStrs))
{
using (SqlCommand cmd = GetSqlCommand(sql, conn, cmdType, tran, sqlParams))
{
try
{
conn.Open();
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
catch (SqlException ex)
{
StringBuilder log = new StringBuilder();
log.Append("查询数据错误:");
log.Append(ex);
throw new Exception(log.ToString());
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 返回影响的行数
/// </summary>
/// <param name="sql"></param>
/// <param name="cmdType"></param>
/// <param name="tran"></param>
/// <param name="sqlParams"></param>
/// <returns></returns>
public static int ExecNonQuery(string sql, CommandType cmdType, SqlTransaction tran, params SqlParameter[] sqlParams)
{
/*定义: SqlCommand cmd = new SqlCommand();//或者SqlCommand cmd = new SqlConnection().CreateCommand(); 注意参数
cmd.CommandType = CommandType.StoredProcedure; //存储过程
cmd.CommandType = CommandType.Text; //sql语句
cmd.CommandType = CommandType.TableDirect; System.Data.CommandType.TableDirect表示要执行的是表
,此时,cmd.CommandText 的值应该是要查询表的的名称。查询结果返回的是整个表。
*/
int count = ;
using (SqlConnection conn = new SqlConnection(connStrs))
{
using (SqlCommand cmd = GetSqlCommand(sql, conn, cmdType, tran, sqlParams))
{ try
{
conn.Open(); if (cmdType == CommandType.StoredProcedure)
cmd.Parameters.AddWithValue("@RETURN_VALUE", "").Direction = ParameterDirection.ReturnValue;
count = cmd.ExecuteNonQuery();
if (count <= )
if (cmdType == CommandType.StoredProcedure)
count = (int)cmd.Parameters["@RETURN_VALUE"].Value;
}
catch (SqlException ex)
{
StringBuilder log = new StringBuilder();
log.Append("查询数据错误:");
log.Append(ex);
throw new Exception(log.ToString());
}
finally
{
conn.Close();
}
}
}
return count;
}
     //返回查询结果的第一行第一列
public static object QueryScalar(string sql, CommandType cmdType, SqlTransaction tran, params SqlParameter[] sqlParams)
{
using (SqlConnection conn = new SqlConnection(connStrs))
{
using (SqlCommand cmd = GetSqlCommand(sql, conn, cmdType, tran, sqlParams))
{
try
{
conn.Open();//创建cmd之前或之后Open都是可以的
return cmd.ExecuteScalar();
}
catch (SqlException ex)
{
StringBuilder log = new StringBuilder();
log.Append("查询数据出错:");
log.Append(ex);
throw new Exception(log.ToString());
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 使用完应关闭Reader;因为SQLDataReader为在线操作数据库,所以这个封装的方法中不能关闭连接;
/// </summary>
/// <param name="sql"></param>
/// <param name="cmdType"></param>
/// <param name="tran"></param>
/// <param name="sqlParams"></param>
/// <returns></returns>
public static SqlDataReader GetDataReader(string sql, CommandType cmdType, SqlTransaction tran, params SqlParameter[] sqlParams)
{
//SqlDataReader要求,它读取数据的时候有,它独占它的SqlConnection对象,而且SqlConnection必须是Open状态
//SqlDataReader与SqlDataAdapter的区别:SqlDataReader为在线操作数据库,SqlDataAdapter为离线操作(打开连接获取数据集之后关闭连接,然后离线操作数据库,然后再打开连接将数据更新到数据库)
SqlConnection conn = new SqlConnection(connStrs);//不可以使用using
SqlCommand cmd = GetSqlCommand(sql, conn, cmdType, tran, sqlParams);
try
{
conn.Open();
//CommandBehavior.CloseConnection当SqlDataReader释放的时候,顺便把SqlConnection对象也释放掉
return cmd.ExecuteReader(CommandBehavior.CloseConnection);//在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭
}
catch (SqlException ex)
{
          conn.Close();//异常时要关闭连接
StringBuilder log = new StringBuilder();
log.Append("查询数据错误:");
log.Append(ex);
throw new Exception(log.ToString());
}
}
}
}

C# sqlhelper 整理的更多相关文章

  1. 自用类库整理之SqlHelper和MySqlHelper

    自用类库整理之SqlHelper和MySqlHelper 自用的SQLHelper和MySqlHelper,除一些通用方法外,封装了一些很实用的批量操作方法,简单介绍下 SqlHelper Execu ...

  2. [转]自用类库整理之SqlHelper和MySqlHelper

    本文转自:http://www.cnblogs.com/lzrabbit/p/3287155.html 自用的SQLHelper和MySqlHelper,除一些通用方法外,封装了一些很实用的批量操作方 ...

  3. 整理出一个比较实用的SqlHelper类 满足大多数情况的使用

    /// <summary> /// SqlHelper类 by zy 2016-3-11 /// </summary> public sealed class SqlHelpe ...

  4. Markdown 语法整理

    Markdown 语法整理 白宁超 2015年7月24日14:57:49 一.字体设置 A First Level Header == A Second Level Header -- # 标题 ## ...

  5. ADO.NET复习——自己编写SqlHelper类

    今天复习了一次ADO.NET基础,整理一下自己的认为的重点: 编写SqlHelper类,方便我们执行数据库语句,这时可以直接调用封装在SqlHelper类的方法.现在大多数公司面试的时候,给你的面试题 ...

  6. ASP.NET MVC5 及 EF6 学习笔记 - (目录整理)

    个人从传统的CS应用开发(WPF)开始转向BS架构应用开发: 先是采用了最容易上手也是最容易搞不清楚状况的WebForm方式入手:到后面就直接抛弃了服务器控件的开发方式,转而采用 普通页面+Ajax+ ...

  7. 数据库操作类《SqlHelper》

    一.背景 在看了一本书叫<Visual Studio 2010(C#)Windows数据库项目开发>后,觉得很多编程技术需要积累,因为一个简单的项目里包含的技术太多了,容易忘记.每次需要用 ...

  8. SqlHelper DBHelper

    根据自己项目的开发需要,整理了一个SqlHelper类 相比较网上通用的SqlHelper类方法主要有一下几点的不同: 1.因为要操作多个数据库,所以数据库连接字符串没有写死到方法里,作为参数提供出来 ...

  9. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

随机推荐

  1. 735. Asteroid Collision彗星相撞后的消失数组

    [抄题]: We are given an array asteroids of integers representing asteroids in a row. For each asteroid ...

  2. Js学习(6) 标准库-Array对象

    Array是Js的原生对象,同时也是一个构造函数,可以用它生成新的数组 用不用new结果都一样 var arr = new Array(2); // 等同于 var arr = Array(2); 但 ...

  3. tiny4412 --uboot移植(1)

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  4. 代码之髓读后感——语法&流程&函数&错误处理

    title: 代码之髓读后感2.md date: 2017-07-08 17:33:11 categories: tags: Perl的设计者:Larry Wall在<Programming P ...

  5. GUI设计和UI设计有什么区别?

    首先从技术的角度分析两者处于包含与被包含的关系. GUI=Graphical User Interface,是指在计算机出现后,在屏幕上使用图形界面来帮助(User)与机器打交道用的界面接口,泛指在计 ...

  6. 第二次spring会议

    今天所做之事: 我用C#用DelectText对行数进行了定义,刚开始写代码有点无从下手. 遇到的问题:刚开始用datagridView进行了文本的输入,但是它更适合EXCEL之类的数据计算不符合我们 ...

  7. springMVC学习 十二 拦截器

    一 拦截器概述 拦截器技术比较像java web技术中的过滤器技术,都是发送 请求时被拦截器拦截,在控制器的前后添加额外功能.但是和Spring中的Aop技术是由区别的.AOP 在特定方法前后扩充(一 ...

  8. delphi 中record 的类操作符重载简介

    今天简单介绍一下 delphi 中record 的类操作符重载使用,就是如何 实现 record 之间的简单操作. 关于类操作符重载 ,大家可以看官方的文档. Delphi allows certai ...

  9. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax;问题的解决

    哇,时隔两天时间,终于找到这个问题的解决办法,先看问题 这是我最近写的家庭记账本网页版,按顺序输入点击保存,总是弹出添加失败的提示 顺着找原因,把原因锁定在dao层的sql语句上,反复检查,没有找到一 ...

  10. 学习Acegi应用到实际项目中(5)

    实际企业应用中,用户密码一般都会进行加密处理,这样才能使企业应用更加安全.既然密码的加密如此之重要,那么Acegi(Spring Security)作为成熟的安全框架,当然也我们提供了相应的处理方式. ...