注意:代码直接Copy调用即可,SQLServer工具类跟我上一个Oracle工具类有所不同,区别在于调用存储过程中时参数的使用,无需输入对应存储游标名称

特点:根据用户传入的参数类型来识别存储中对应的参数数据类型

        /// <summary>
///基於.net( 向下兼容4.0)開發 SQLServerDBHelper工具類
///<para>作者: 会害羞的青蛙</para>
///<para>時間: 2019-12-6</para>
/// </summary>
public class SQLServerDBHelper
{
/// <summary>
/// 執行SQL語句返回DataTable
/// </summary>
/// <param name="SQL">SQL語句</param>
/// <param name="DBUrl">數據庫鏈接地址</param>
/// <returns></returns>
public DataTable GetDataTableBySQL(string SQL, string DBUrl)
{
// 获取与数据库的连接对象並且绑定连接字符串
SqlConnection conn = new SqlConnection(DBUrl);
conn.Open();//打開資源
//获取数据库操作对象
SqlCommand cmd = conn.CreateCommand();
try
{
cmd.CommandText = SQL;
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dataTable = new DataTable();
dataTable.TableName = "數據集";
adapter.Fill(dataTable);
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
return dataTable;
}
catch (Exception ex)
{
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
throw ex;
}
}
/// <summary>
/// 執行非查詢的SQL語句
/// </summary>
/// <param name="SQL">SQL語句</param>
/// <param name="DBUrl">數據庫鏈接地址</param>
/// <returns></returns>
public int GetNonQueryBySQL(string SQL, string DBUrl)
{
// 获取与数据库的连接对象並且绑定连接字符串
SqlConnection conn = new SqlConnection(DBUrl);
conn.Open();//打開資源
//获取数据库操作对象
SqlCommand cmd = conn.CreateCommand();
try
{
cmd.CommandText = SQL;
int num = cmd.ExecuteNonQuery();
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
return num;
}
catch (Exception ex)
{
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
throw ex;
}
}
/// <summary>
/// 執行多條SQL語句,實現數據庫事務。
/// </summary>
/// <param name="SQLStringList">多條SQL語句</param>
/// <param name="BDUrl">數據庫鏈接地址</param>
public int GetNonQueryByManySQL(ArrayList SQLStringList, string BDUrl)
{
using (SqlConnection conn = new SqlConnection(BDUrl))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
int num = 0;
for (int i = 0; i < SQLStringList.Count; i++)
{
string SQL = SQLStringList[i].ToString();//獲取SQL語句
if (SQL.Trim().Length > 1)
{
cmd.CommandText = SQL;
num = cmd.ExecuteNonQuery();
}
tx.Commit();//提交事務
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉 }
return num;//返回執行結果數量
}
catch (SqlException E)
{
tx.Rollback();//事務回滾
throw new Exception(E.Message);
}
}
}
/// <summary>
/// 調用存儲返回單個結果集
/// <para>obj使用方法:new{ v_data=value, v_data1=value1}</para>
/// <para>注意:obj中v_data為存儲參數名稱,value為對應的值,在SQLServer中沒有游標所以不需要定義輸出參數</para>
/// </summary>
/// <param name="storageName">存儲名稱</param>
/// <param name="DBUrl">數據庫鏈接地址</param>
/// <param name="obj">存儲參數對象</param>
/// <returns></returns>
public DataTable GetDataTableByStorageName(string storageName, string DBUrl, object obj)
{
// 获取与数据库的连接对象並且绑定连接字符串
SqlConnection conn = new SqlConnection(DBUrl);
conn.Open();//打開資源
//获取数据库操作对象
SqlCommand cmd = conn.CreateCommand();
try
{
cmd.CommandText = storageName;//存儲名稱
cmd.CommandType = CommandType.StoredProcedure;
PropertyInfo[] properties = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);//獲取object中的字段名和值
for (int i = 0; i < properties.Length; i++)
{//設定輸入的類型和值
cmd.Parameters.Add(properties[i].Name, GetOracleDbType(properties[i], obj)).Direction = ParameterDirection.Input;
cmd.Parameters[properties[i].Name].Value = properties[i].GetValue(obj, null);//賦值
}
DataTable dataTable = new DataTable();
SqlDataAdapter oda = new SqlDataAdapter(cmd);
oda.Fill(dataTable);
dataTable.TableName = "數據集";
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
return dataTable;
}
catch (Exception ex)
{
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
throw ex;
}
}
/// <summary>
/// 調用存儲返回String字符串信息(最後一個位置必須為String類型字符,位置不能顛倒)
/// <para>obj使用方法:new{ v_data=value, v_data1=value1,out_string=""}</para>
/// <para>注意:obj中v_data為存儲參數名稱,value為對應的值,out_string為輸出參數不需要輸入值</para>
/// </summary>
/// <param name="storageName"></param>
/// <param name="DBUrl"></param>
/// <param name="obj"></param>
/// <returns></returns>
public string GetStringDataByStorageName(string storageName, string DBUrl, object obj)
{
SqlConnection conn = new SqlConnection(DBUrl);
conn.Open();
//获取数据库操作对象
SqlCommand cmd = conn.CreateCommand();
try
{
cmd.CommandText = storageName;//存儲名稱
cmd.CommandType = CommandType.StoredProcedure;
PropertyInfo[] properties = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);//獲取object中的字段名和值
for (int i = 0; i < properties.Length; i++)
{
if (i == (properties.Length - 1))
{ //設定輸出的類型和值
cmd.Parameters.Add("@" + properties[i].Name, SqlDbType.NVarChar, short.MaxValue).Direction = ParameterDirection.Output;
cmd.Parameters["@" + properties[i].Name].Value = DBNull.Value;//賦值
}
else
{//設定輸入的類型和值
cmd.Parameters.Add(properties[i].Name, GetOracleDbType(properties[i], obj)).Direction = ParameterDirection.Input;
cmd.Parameters["@" + properties[i].Name].Value = properties[i].GetValue(obj, null);//賦值
}
}
cmd.ExecuteNonQuery();
string message = cmd.Parameters["@" + properties[properties.Length - 1].Name].Value.ToString();//獲取返回的值
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
return message;
}
catch (Exception ex)
{
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
throw ex;
}
}
/// <summary>
/// 調用存儲返回String字符串信息和DataTable數據表格(最後一個為輸出字符串,位置不能顛倒)
/// <para>obj使用方法:new{ v_data=value, v_data1=value1,out_string=""}</para>
/// <para>注意:obj中v_data為存儲參數名稱,value為對應的值,out_string為輸出參數不需要輸入值, 在SQLServer中沒有游標所以不需要定義輸出參數</para>
/// </summary>
/// <param name="storageName">存儲名稱</param>
/// <param name="DBUrl">數據庫鏈接地址</param>
/// <param name="obj">存儲參數對象</param>
/// <param name="dataTable">返回結果集</param>
/// <returns></returns>
public string GetStringAndDataTableByStorageName(string storageName, string DBUrl, object obj, out DataTable dataTable)
{
// 获取与数据库的连接对象並且绑定连接字符串
SqlConnection conn = new SqlConnection(DBUrl);
conn.Open();//打開資源
//获取数据库操作对象
SqlCommand cmd = conn.CreateCommand();
try
{
cmd.CommandText = storageName;//存儲名稱
cmd.CommandType = CommandType.StoredProcedure;
PropertyInfo[] properties = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);//獲取object中的字段名和值
for (int i = 0; i < properties.Length; i++)
{
if (i == (properties.Length - 1))
{//設定輸出的類型和值
cmd.Parameters.Add(properties[i].Name, SqlDbType.NVarChar, short.MaxValue).Direction = ParameterDirection.Output;
cmd.Parameters[properties[i].Name].Value = DBNull.Value;//賦值
}
else
{//設定輸入的類型和值
cmd.Parameters.Add(properties[i].Name, GetOracleDbType(properties[i], obj)).Direction = ParameterDirection.Input;
cmd.Parameters[properties[i].Name].Value = properties[i].GetValue(obj, null);//賦值
}
}
DataTable dt = new DataTable();
SqlDataAdapter oda = new SqlDataAdapter(cmd);
oda.Fill(dt);
dt.TableName = "數據集";
dataTable = dt;//返回數據結果集
string message = cmd.Parameters[properties[properties.Length - 1].Name].Value.ToString();//獲取輸出的字符串
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
return message;
}
catch (Exception ex)
{
cmd.Dispose();//釋放資源
conn.Dispose();//釋放資源
conn.Close();//關閉
throw ex;
}
}
/// <summary>
/// 將輸入參數的類型與SQLServer中的參數類型轉化一致
/// </summary>
/// <param name="propertyInfo">屬性特征</param>
/// <param name="obj">對象</param>
/// <returns></returns>
private SqlDbType GetOracleDbType(PropertyInfo propertyInfo, object obj)
{
try
{
SqlDbType sqlDbType = new SqlDbType();
switch (propertyInfo.GetValue(obj, null).GetType().Name)
{
case "String":
sqlDbType = SqlDbType.NVarChar;
break;
case "Int16":
sqlDbType = SqlDbType.SmallInt;
break;
case "Int32":
sqlDbType = SqlDbType.Int;
break;
case "Int64":
sqlDbType = SqlDbType.BigInt;
break;
case "DateTime":
sqlDbType = SqlDbType.DateTime;
break;
case "Boolean":
sqlDbType = SqlDbType.Bit;
break;
case "Byte":
sqlDbType = SqlDbType.TinyInt;
break;
case "Decimal":
sqlDbType = SqlDbType.Decimal;
break;
}
return sqlDbType;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
        /// 以現有表格數據批量添加數據
        /// </summary>
        /// <param name="dt">數據表格</param>
/// <param name="FormName">數據表名</param>
        /// <param name="DBUrl">數據庫鏈接地址</param>
        /// <returns></returns>
public bool AddInBatchesToDataTable(DataTable dt,string FormName, string DBUrl )
{
try
{
if (FormName.ToString().Trim() == "") throw new Exception("數據表名不能为空");
System.Diagnostics.Debug.WriteLine("----------------------開始執行--------------------------");
System.Diagnostics.Debug.WriteLine("執行表明:" + dt.TableName + "--------------------------");
long star = Convert.ToInt64(System.DateTime.Now.ToString("yyyyMMddHHmmssfff"));
SqlConnection conn = new SqlConnection(DBUrl);
SqlBulkCopy bulkCopy = new SqlBulkCopy(DBUrl, SqlBulkCopyOptions.UseInternalTransaction);
bulkCopy.BatchSize = 100000;
bulkCopy.BulkCopyTimeout = 260;
bulkCopy.DestinationTableName = FormName; //服务器上目标表的名称
bulkCopy.BatchSize = dt.Rows.Count; //每一批次中的行数
try
{
conn.Open();
if (dt != null && dt.Rows.Count != 0)
bulkCopy.WriteToServer(dt); //将提供的数据源中的所有行复制到目标表中
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
if (bulkCopy != null)
bulkCopy.Close();
}
long end = Convert.ToInt64(System.DateTime.Now.ToString("yyyyMMddHHmmssfff"));
System.Diagnostics.Debug.WriteLine("共添加:" + dt.Rows.Count + "條數數據----耗時:" + ((end - star) / 10000) + "." + ((end - star) % 10000) + "秒");
System.Diagnostics.Debug.WriteLine("----------------------執行結束--------------------------");
return true;
}
catch (Exception ex)
{
throw ex;
}
}
}

  

基于SqlClient开发SQLServer工具类 伸手党的福音的更多相关文章

  1. 基于ManagedDataAccess开发的OracleDBHelpe工具集伸手党的福音

    在使用前先加入ManagedDataAccessDLL文件方可使用 添加方法:右键项目.点击管理NuGet程序包,点击浏览,在输入框内输入ManagedDataAccess,再点击安装即可 Oracl ...

  2. DbUtils是Apache出品一款简化JDBC开发的工具类

    DbUtils     - DbUtils是Apache出品一款简化JDBC开发的工具类     - 使用DbUtils可以让我们JDBC的开发更加简单     - DbUtils的使用:       ...

  3. 用Java开发一个工具类,提供似于js中eval函数功能的eval方法

    今天在看到<Java疯狂讲义>中一个章节习题: 开发一个工具类,该工具类提供一个eval()方法,实现JavaScript中eval()函数的功能--可以动态运行一行或多行程序代码.例如: ...

  4. iOS开发——基于corelocation位置定位——工具类

    (代码工具类已写好,空闲时间整理成文档,待更新……)

  5. Android开发常用工具类

    来源于http://www.open-open.com/lib/view/open1416535785398.html 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前 ...

  6. IOS开发--常用工具类收集整理(Objective-C)(持续更新)

    前言:整理和收集了IOS项目开发常用的工具类,最后也给出了源码下载链接. 这些可复用的工具,一定会给你实际项目开发工作锦上添花,会给你带来大大的工作效率. 重复造轮子的事情,除却自我多练习编码之外,就 ...

  7. android 开发 常用工具类

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅 ...

  8. Java 连接 SqlServer工具类

    1.下载 server2008R2驱动jar包 下载jar包 http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=21599 2. ...

  9. 最全Android开发常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括  HttpUtils.DownloadManagerPro.Safe.ijiami.ShellUtils.Pack ...

随机推荐

  1. jquery中的ajax请求到php(学生笔记)

    首先ajax的基本语法基础.(必须得引入一个jquery文件,下面的例子展示用了网上的jquery文件,要联网.) 2.请求成功(复制代码运行观察效果) <!DOCTYPE html> & ...

  2. mysql修改数据 -- 主键冲突

    mysql 插入数据唯一键冲突 前提: 修改数据三种可用的方法解决主键冲突的问题 1. insert into ... on duplicate key update set ... 2. updat ...

  3. Java生鲜电商平台-B2B生鲜的互联网思维

    Java生鲜电商平台-B2B生鲜的互联网思维 在互联网高速发展的今天,为我们的生活带来了众多便利.然而互联网从早期的萌芽状态到现在妇孺皆知,它的崛起速度远远超乎世人的想象.人们开始关注互联网并且研究它 ...

  4. springBoot 集成Mysql数据库

    springBoot 集成Mysql数据库 前一段时间,我们大体介绍过SpringBoot,想必大家还有依稀的印象.我们先来回顾一下:SpringBoot是目前java世界最流行的一个企业级解决方案框 ...

  5. 尉蓝色的P2P金融众筹平台手机模板

    蓝色的p2p金融投资众筹网手机模板html整站下载.实用的众筹app手机模板下载.主要页面有:众筹项目.发布.个人中心.登录.注册.优惠券.回报.项目详情.我要支持.帮助中心等总共37个手机页面. 模 ...

  6. 用css做三角形

    <html> <body> <style> .trlangle{ width: 0; height: 0; border-left: 50px solid tran ...

  7. nRF24L01+不能接收或接收偶尔异常等问题实战分享

    nRF24L01+接收异常问题综述 在调试nRF24L01+无线收发模块的时候,最具标志性的环节就是在接收端可以收到数据.在实际应用调试中,会出现很多意想不到的情况,造成nRF24L01+模块接收端无 ...

  8. 源码包安装转换rpm包

    目录 纯净版虚拟机 1. 先安装个虚拟机,登陆nginx官网 http://nginx.org/选择一个稳定的版本 2. 右键复制地址,到新克隆的纯净虚拟机wget 下载 3.源码包 4.解压 tar ...

  9. 获取SpringCloud gateway响应的response的值,记录踩坑

    最近在做网关改造,想要通过Gateway过滤器获取ResponseBody的值,查看了网上的帖子和官网内容: 帖子:https://cloud.tencent.com/developer/articl ...

  10. Python正则、re模块

    正则的概念 findall        match        search  方法 元字符的用法和作用 正则表达式概念 正则表达式是对字符串操作的一种逻辑公式,就是对字符串的一种过滤 可以判断是 ...