ADO.net方法
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Reflection; namespace DAL.DataUtil
{
/// <summary>
/// SqlServer数据访问控制类
/// </summary>
public class DataProvider
{
public string ConnectionString { get; set; } #region 私有方法 /// <summary>
/// SqlCommand 对象执行SQL脚本前的准备工作
/// </summary>
/// <param name="cmd">SqlCommand 对象</param>
/// <param name="conn">SqlConnection 对象</param>
/// <param name="trans">SqlTransaction 对象</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdParms">SqlCommand 对象使用的 SqlParameter 参数集合</param>
private void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans,
CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open(); cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = cmdType; if (trans != null)
cmd.Transaction = trans; if (cmdParms != null)
{
foreach (SqlParameter param in cmdParms)
cmd.Parameters.Add(param);
}
} /// <summary>
/// SqlDataAdapter 对象使用前的准备工作
/// </summary>
/// <param name="adapter">SqlDataAdapter 对象</param>
/// <param name="conn">SqlConnection 对象</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdParms">SqlCommand 对象使用的 SqlParameter 参数集合</param>
private void PrepareAdapter(SqlDataAdapter adapter, SqlConnection conn,
CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
{
SqlCommand cmd = new SqlCommand(cmdText, conn); cmd.CommandType = cmdType;
if (cmdParms != null)
{
foreach (SqlParameter param in cmdParms)
cmd.Parameters.Add(param);
}
adapter.SelectCommand = cmd;
} #endregion #region 公有方法 /// <summary>
/// 对连接执行 SQL 语句并返回受影响的行数。
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <returns>受影响的行数</returns>
public int ExecuteNonQuery(string cmdText, CommandType cmdType)
{
return ExecuteNonQuery(cmdText, cmdType, null);
} /// <summary>
/// 对连接执行 SQL 语句并返回受影响的行数。
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <param name="parameters">SqlParameter 参数集合</param>
/// <returns>受影响的行数</returns>
public int ExecuteNonQuery(string cmdText, CommandType cmdType, SqlParameter[] parameters)
{
SqlCommand cmd = new SqlCommand();
int val = ;
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, parameters);
val = cmd.ExecuteNonQuery();
if (parameters != null)
{
cmd.Parameters.Clear();
}
}
catch
{
conn.Close();
conn.Dispose();
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Dispose();
}
}
return val;
}
} /// <summary>
/// 对连接执行多条 SQL 语句,并加入事务处理
/// </summary>
/// <param name="cmdTexts">SQL 语句数组</param>
public void ExecuteNonQueryWithTransaction(string[] cmdTexts)
{
SqlCommand cmd = new SqlCommand(); using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
SqlTransaction trans = conn.BeginTransaction(); try
{
foreach (string sql in cmdTexts)
{
PrepareCommand(cmd, conn, trans, CommandType.Text, sql, null);
cmd.ExecuteNonQuery();
}
trans.Commit();
}
catch
{
trans.Rollback();
conn.Close();
conn.Dispose();
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Dispose();
}
}
}
} /// <summary>
/// 对连接执行多条 SQL 语句,并加入事务处理
/// </summary>
/// <param name="commands">SQL命令数组。
/// Command 封装了 SqlCommand 对象需要的 CommandText、CommandType、SqlParameterCollection,以便分别执行每一组SQL脚本</param>
public void ExecuteNonQueryWithTransaction(Command[] commands)
{
SqlCommand cmd = new SqlCommand(); using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
SqlTransaction trans = conn.BeginTransaction(); try
{
foreach (Command command in commands)
{
PrepareCommand(cmd, conn, trans, command.CommandType, command.CommandText, command.Parameters);
cmd.ExecuteNonQuery();
if (command.Parameters != null)
{
cmd.Parameters.Clear();
}
}
trans.Commit();
}
catch
{
trans.Rollback();
conn.Close();
conn.Dispose();
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Dispose();
}
}
}
} /// <summary>
/// 执行SQL脚本,返回查询得到的 DataReader 结果集
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <returns>DataReader 结果集</returns>
public SqlDataReader ExecuteReader(string cmdText, CommandType cmdType)
{
return ExecuteReader(cmdText, cmdType, null);
} /// <summary>
/// 执行SQL脚本进行查询,返回得到的 DataReader 结果集
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <param name="parameters">SqlParameter 参数集合</param>
/// <returns>DataReader 结果集</returns>
public SqlDataReader ExecuteReader(string cmdText, CommandType cmdType, SqlParameter[] parameters)
{
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(ConnectionString); try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, parameters);
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if (parameters != null)
{
cmd.Parameters.Clear();
} return reader;
}
catch
{
conn.Close();
conn.Dispose();
throw;
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Dispose();
}
}
} /// <summary>
/// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <returns>结果集中第一行的第一列</returns>
public object ExecuteScalar(string cmdText, CommandType cmdType)
{
return ExecuteScalar(cmdText, cmdType, null);
} /// <summary>
/// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <param name="parameters">SqlParameter 参数集合</param>
/// <returns>结果集中第一行的第一列</returns>
public object ExecuteScalar(string cmdText, CommandType cmdType, SqlParameter[] parameters)
{
SqlCommand cmd = new SqlCommand();
object val = new object();
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, parameters);
val = cmd.ExecuteScalar();
if (parameters != null)
{
cmd.Parameters.Clear();
}
}
catch
{
conn.Close();
conn.Dispose();
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Dispose();
}
}
return val;
}
} /// <summary>
/// 执行查询,将查询结果填充到 DataSet 并返回
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <returns>查询结果集</returns>
public DataSet FillDataSet(string cmdText, CommandType cmdType)
{
return FillDataSet(cmdText, cmdType, null);
} /// <summary>
/// 执行查询,将查询结果填充到 DataSet 并返回
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <param name="parameters">SqlParameter 参数集合</param>
/// <returns>查询结果集</returns>
public DataSet FillDataSet(string cmdText, CommandType cmdType, SqlParameter[] parameters)
{
SqlDataAdapter adapter = new SqlDataAdapter();
DataSet dataSet = new DataSet();
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
try
{
PrepareAdapter(adapter, conn, cmdType, cmdText, parameters);
adapter.Fill(dataSet);
}
catch
{
conn.Close();
conn.Dispose();
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Dispose();
}
}
return dataSet;
}
} /// <summary>
/// 执行查询,将查询结果填充到 DataTable 并返回
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <returns>查询结果集</returns>
public DataTable FillDataTable(string cmdText, CommandType cmdType)
{
return FillDataTable(cmdText, cmdType, null);
} /// <summary>
/// 执行查询,将查询结果填充到 DataTable 并返回
/// </summary>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <param name="parameters">SqlParameter 参数集合</param>
/// <returns>查询结果集</returns>
public DataTable FillDataTable(string cmdText, CommandType cmdType, SqlParameter[] parameters)
{
SqlDataAdapter adapter = new SqlDataAdapter();
DataTable table = new DataTable();
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
try
{
PrepareAdapter(adapter, conn, cmdType, cmdText, parameters);
adapter.Fill(table);
}
catch
{
conn.Close();
conn.Dispose();
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Dispose();
}
}
return table;
}
} /// <summary>
/// 执行只返回一条记录的查询,把返回的记录反射成一个实体对象,实体对象类型由传入的类型决定。
/// 传入的类型和返回类型要一致
/// </summary>
/// <typeparam name="T">要反射封装的对象实体类型。必须和返回类型一致</typeparam>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <returns>封装好的对象实体。必须和传入参数类型一致</returns>
public T ReflectObject<T>(string cmdText, CommandType cmdType)
{
return ReflectObject<T>(cmdText, cmdType, null);
} /// <summary>
/// 执行只返回一条记录的查询,把返回的记录反射成一个实体对象,实体对象类型由传入的类型决定。
/// 传入的类型和返回类型要一致
/// </summary>
/// <typeparam name="T">要反射封装的对象实体类型。必须和返回类型一致</typeparam>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <param name="parameters">SqlParameter 参数集合</param>
/// <returns>封装好的对象实体。必须和传入参数类型一致</returns>
public T ReflectObject<T>(string cmdText, CommandType cmdType, SqlParameter[] parameters)
{
SqlCommand cmd = new SqlCommand();
T obj = default(T); using (SqlConnection conn = new SqlConnection(ConnectionString))
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, parameters); using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection | CommandBehavior.SingleRow))
{
if (reader.Read())
{
obj = (T)Activator.CreateInstance(typeof(T));
Type type = obj.GetType(); for (int i = ; i < reader.FieldCount; i++)
{
if (!reader.IsDBNull(i))
{
try
{
type.InvokeMember(reader.GetName(i), BindingFlags.Default | BindingFlags.SetProperty, null, obj, new object[] { reader.GetValue(i) });
}
catch (MissingMemberException exception)
{
//Column/Property names don't match, thus throwing an exception. Ignored
System.Diagnostics.Debug.WriteLine(exception.Message);
}
}
} reader.Close();
}
}
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
} return obj;
} /// <summary>
/// 执行查询,把返回的记录集反射成一个实体对象集合,实体对象类型由传入的类型决定。
/// 传入的类型和返回类型要一致
/// </summary>
/// <typeparam name="T">要反射封装的对象实体类型。必须和返回类型一致</typeparam>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <returns>封装好的实体集合。必须和传入参数类型一致</returns>
public List<T> ReflectCollection<T>(string cmdText, CommandType cmdType)
{
return ReflectCollection<T>(cmdText, cmdType, null);
} /// <summary>
/// 执行查询,把返回的记录集反射成一个实体对象集合,实体对象类型由传入的类型决定。
/// 传入的类型和返回类型要一致
/// </summary>
/// <typeparam name="T">要反射封装的对象实体类型。必须和返回类型一致</typeparam>
/// <param name="cmdText">SQL脚本</param>
/// <param name="cmdType">命令类型:存储过程或普通SQL脚本</param>
/// <param name="parameters">SqlParameter 参数集合</param>
/// <returns>封装好的实体集合。必须和传入参数类型一致</returns>
public List<T> ReflectCollection<T>(string cmdText, CommandType cmdType, SqlParameter[] parameters)
{
SqlCommand cmd = new SqlCommand(); using (SqlConnection conn = new SqlConnection(ConnectionString))
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, parameters); using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
List<T> objList = new List<T>(); while (reader.Read())
{
T obj = (T)Activator.CreateInstance(typeof(T));
Type type = obj.GetType(); for (int i = ; i < reader.FieldCount; i++)
{
if (!reader.IsDBNull(i))
{
try
{
type.InvokeMember(reader.GetName(i), BindingFlags.Default | BindingFlags.SetProperty, null, obj, new object[] { reader.GetValue(i) });
}
catch (MissingMemberException exception)
{
//Column/Property names don't match, thus throwing an exception. Ignored
System.Diagnostics.Debug.WriteLine(exception.Message);
}
}
}
objList.Add(obj);
} reader.Close();
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
return objList;
}
}
} #endregion
}
}
ADO.net方法的更多相关文章
- ADO.NET---ExcuteScalar()方法复习
ExcuteScalar(),返回的是查询结果的第一行第一列,返回值是object类型,一般用来查询表中有多少条数据,求最大值等 现在我们用ExcuteScalar()做个测试,需求:我要查询学生表里 ...
- ODBC与ADO 连SQL Server 2005
ADO是microsoft数据库应用程序开发的连连接口,是建立在OLE DB之上的高层 ADO使用方法步骤: 1.初始化COM库,引入ADO库定义 2.用connection对象连接数据库 3.利用连 ...
- ADO.Net知识总结
(一)基础知识 ADO.NET: .NET中用来向数据库提交执行SQL语句的一堆类 本机访问直接"Windows验证",但是一般项目中都是单独的数据库服务器,程序在另外一台电脑上连 ...
- ADO数据库操作方式
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件.它提供了编程语言和统一数据访问方式OLE DB的一个中间层.允许开发人员编写访问数据的代码而不用关心数 ...
- Delphi中的ADOquery 用法以及ADOquery的自有方法Append 和Delete和 Edit 和Post
Delphi在数据库操作是非常好用的,delphi把ADO一些方法属性都集成了,以下是我的一些总结:*******************************通过sql的存储过程来实现:添加Wit ...
- 海量数据插入数据库效率对照測试 ---ADO.NET下SqlBulkCopy()对照LINQ 下InsertAllOnSubmit()
摘要:使用.NET相关技术向数据库中插入海量数据是经常使用操作.本文对照ADO.NET和LINQ两种技术.分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作. 得出 ...
- 8天掌握EF的Code First开发之Entity Framework介绍
返回<8天掌握EF的Code First开发>总目录 本篇目录 Entity Framework概要 什么是ORM Entity Framework简史 Entity Framework具 ...
- loadrunner协议选择
协议选择参考: 应用类型 协议选择 web网站 http/HTML FTP服务器 FTP 邮件服务器 IMAP\POP3\SMTP CS:客户端以ADO,OLEDB方法连接后台数据库 MS SQLSe ...
- .net下mysql存储过程返回自定义值(原创)
ado.net方法 public static string ExecuteQueryProc(string sConnStr, string sSql, Hashtable args) { MySq ...
随机推荐
- posix多线程--线程私有数据
1.当多个线程共享一个变量时,将该变量定义为静态或外部变量,使用互斥量确保共享变量的安全访问.如果每个线程都需要一个私有变量值,则该值成为线程的私有数据.程序创建一个键,每个线程独立地设定或得到自己的 ...
- Objective-C的“多继承”——消息转发
Objective-C的“多继承”——消息转发 当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承.多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模.但是Objecti ...
- maven打包可以行文件,包含依赖包等
<build> <!-- 设定打包的名称 --> <finalName>ismp2xy</finalName> <plugins> < ...
- System.Data.SqlClient.SqlError:无法打开备份设备'D:\..\abc.bak'
在SQL Server中备份数据库时遇到备份对于服务器“服务器名”失败. (Microsoft.SqlServer.Smo)其他信息:System.Data.SqlClient.SqlError:无法 ...
- IR的评价指标之MRR
MRR(Mean Reciprocal Rank): 是一个国际上通用的对搜索算法进行评价的机制,即第一个结果匹配,分数为1,第二个匹配分数为0.5,第n个匹配分数为1/n,如果没有匹配的句子分数为0 ...
- python生成二维数组
Array= [[0 for i in range(15)] for i in range(15)]
- [Makefile]多目录Makefile写法
最近需要写一个测试程序,这个测试程序需要集成一些功能,写在同一个文件看上去很不好,多个文件的Makefile又不是很熟,于是分享下面这篇文章 先介绍下,调试Makefile时,想知道某个变量的值,怎么 ...
- jackson2.1.4 序列化 通过给定Class映射 与抽象类的映射
//如果已知想要序列化的类型 可以使用TypeReference来进行处理 //List<MyBean> result = mapper.readValue(src, new TypeRe ...
- 4种用于构建嵌入式linux系统的工具_转
转自:4种用于构建嵌入式linux系统的工具 Linux 被部署到比 Linus Torvalds 在他的宿舍里开发时所预期的更广泛的设备.令人震惊的支持了各种芯片,使得Linux 可以应用于大大小小 ...
- Nginx实战系列之功能篇----后端节点健康检查(转)
公司前一段对业务线上的nginx做了整理,重点就是对nginx上负载均衡器的后端节点做健康检查.目前,nginx对后端节点健康检查的方式主要有3种,这里列出: 1.ngx_http_proxy_m ...