SQLServer与ADO.Net(五)
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
1、SQLHelper(重点)
l 封装一个SQLHelper类方便使用,提供
• -> ExecuteDataTable(string sql,params SqlParameter[] parameters)
• -> ExecuteNonQuery(string sql,params SqlParameter[] parameters)
• -> ExecuteScalar(string sql,params SqlParameter[] parameters)
• -> 网上有微软提供的最全的SQLHelper类,是Enterprise Library中的一部分
l sqlconnection在程序中一直保持它open可以吗?对于数据库来说,连接是非常宝贵的资源,一定要用完了就close、dispose。
附:随机练习代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//所需引用的命名空间
using System.IO;
using System.Configuration; //需先在项目中手动添加引用->.NET->System.Configuration
using System.Data;
using System.Data.SqlClient;
namespace _05SQLHelper //项目中注意此命名空间名
{
/// <summary>
/// SQL Server 数据访问帮助类
/// </summary>
public static class SQLHelper
{
// 定义数据库连接字符串ConnectionString,读取应用程序配置文件中的<connectionStrings>节点下的配置信息
private static readonly string ConnectionString =ConfigurationManager.ConnectionStrings["SQLConn"].ConnectionString;
/// <summary>
/// SQLHelper的ExecuteNonQuery方法,对连接执行 Transact-SQL 语句并返回受影响的行数。(异常时返回-1)
/// </summary>
/// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
/// <param name="commandText">存储过程名称或SQL语句</param>
/// <param name="commandParameters">SqlParameter参数数组,如果没有参数则为'null'</param>
/// <returns>返回命令影响的行数(异常时返回-1)</returns>
public static int ExecuteNonQuery(CommandType commandType, stringcommandText, params SqlParameter[] commandParameters)
{
using (SqlConnection Connection = new SqlConnection(ConnectionString))
{
using (SqlCommand Command = newSqlCommand(commandText, Connection))
{
Command.CommandType =commandType;
try
{
if (Connection.State ==ConnectionState.Closed)
{
Connection.Open();
}
if (commandParameters!= null)
{
Command.Parameters.AddRange(commandParameters);
returnCommand.ExecuteNonQuery();
}
else
{
returnCommand.ExecuteNonQuery();
}
}
catch (Exception ex)
{
ErrorLog(ex);
return -1;
}
}
}
}
/// <summary>
/// SQLHelper的ExecuteScalar方法,执行查询,并返回查询所返回的结果集中第一行的第一列。
/// 忽略其他列或行。(异常时返回null)
/// </summary>
/// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
/// <param name="commandText">存储过程名称或SQL语句</param>
/// <param name="commandParameters">SqlParameter参数数组,如果没有参数则为'null'</param>
/// <returns>返回结果集中的第一行第一列(异常时返回null)</returns>
public static object ExecuteScalar(CommandType commandType, stringcommandText, params SqlParameter[] commandParameters)
{
using (SqlConnection Connection = new SqlConnection(ConnectionString))
{
using (SqlCommand Command = newSqlCommand(commandText, Connection))
{
Command.CommandType =commandType;
try
{
if (Connection.State ==ConnectionState.Closed)
{
Connection.Open();
}
if (commandParameters!= null)
{
Command.Parameters.AddRange(commandParameters);
return Command.ExecuteScalar();
}
else
{
returnCommand.ExecuteScalar();
}
}
catch (Exception ex)
{
ErrorLog(ex);
return null;
}
}
}
}
/// <summary>
/// SQLHelper的ExecuteReader方法,执行查询,并返回查询所返回的结果集。
/// SqlDataReader对象需在外部手动释放资源。(异常时返回null)
/// </summary>
/// <param name="DataReader">SqlDataReader结果集</param>
/// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
/// <param name="commandText">存储过程名称或SQL语句</param>
/// <param name="commandParameters">SqlParameter参数数组,如果没有参数则为'null'</param>
/// <returns>返回SqlDataReader结果集(异常时返回null)</returns>
public static SqlDataReader ExecuteReader(out SqlDataReader DataReader,CommandType commandType, string commandText, params SqlParameter[]commandParameters)
{
SqlConnection Connection = new SqlConnection(ConnectionString);
using (SqlCommand Command = new SqlCommand(commandText, Connection))
{
Command.CommandType =commandType;
try
{
if (Connection.State ==ConnectionState.Closed)
{
Connection.Open();
}
if (commandParameters !=null)
{
Command.Parameters.AddRange(commandParameters);
DataReader =Command.ExecuteReader(CommandBehavior.CloseConnection);
}
else
{
//CommandBehavior.CloseConnection
// 在执行该命令时,如果关闭关联的DataReader 对象,则关联的 Connection 对象也将关闭。
DataReader =Command.ExecuteReader(CommandBehavior.CloseConnection);
}
}
catch (Exception ex)
{
ErrorLog(ex);
DataReader = null;
}
return DataReader;
}
}
/// <summary>
/// SQLHelper的ExecuteGetDataSet方法,执行查询,并返回查询所返回的结果集填充的DataSet对象。
/// 可手动指定表映射的源表的名称。
/// </summary>
/// <param name="srcTable">用于表映射的源表的名称,如果不想指定则为'null'</param>
/// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
/// <param name="commandText">存储过程名称或SQL语句</param>
/// <param name="commandParameters">SqlParameter参数数组,如果没有参数则为'null'</param>
/// <returns>返回DataSet结果集</returns>
public static DataSet ExecuteGetDataSet(string srcTable, CommandTypecommandType, string commandText, params SqlParameter[] commandParameters)
{
//创建SqlConnection对象Connection
using (SqlConnection Connection = new SqlConnection(ConnectionString))
{
//创建SqlCommand对象Command
using (SqlCommand Command = newSqlCommand(commandText, Connection))
{
//设置SqlCommand.CommandText属性
Command.CommandType =commandType;
//创建一个SqlDataAdapter对象adapter
using (SqlDataAdapteradapter = new SqlDataAdapter())
{
//创建一个DataSet对象dataSet
DataSet dataSet = newDataSet();
try
{
//判断SqlConnection对象的连接状态,避免重复打开连接。
if(Connection.State == ConnectionState.Closed)
{
Connection.Open();
}
//处理SqlParameter参数
if(commandParameters != null)
{
Command.Parameters.AddRange(commandParameters);
//设置SqlDataAdapter.SelectCommand的值
adapter.SelectCommand = Command;
//判断是否手动指定了表映射的源表的名称
if (srcTable !=null)
{
adapter.Fill(dataSet, srcTable);
}
else
{
//向DataSet中添加或刷新行
adapter.Fill(dataSet);
}
}
else
{
adapter.SelectCommand = Command;
if (srcTable != null)
{
//在DataSet中添加或刷新行以匹配使用DataSet 和 DataTable 名称的数据源中的行。
adapter.Fill(dataSet, srcTable);
}
else
{
adapter.Fill(dataSet);
}
}
}
catch (Exception ex)
{
//如出现异常,则将异常写入错误日志
ErrorLog(ex);
}
return dataSet;
}
}
}
}
/// <summary>
/// SQLHelper的ExecuteGetDataAdapter方法,执行查询,返回对应的SqlDataAdapter数据集(方便使用List强类型)。
/// 需在外部释放SqlDataAdapter资源(using(SqlDataAdapter数据集))及销毁SqlConnection对象的连接(调用SQLHelper.DisposeConnection方法)
/// </summary>
/// <paramname="SqlConnectionIndex">SqlConnection连接对象索引值(用于外部释放索引值对应的SqlConnection连接对象)</param>
/// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
/// <param name="commandText">存储过程名称或SQL语句</param>
/// <param name="commandParameters">SqlParameter参数数组,如果没有参数则为'null'</param>
/// <returns>SqlDataAdapter数据集</returns>
public static SqlDataAdapter ExecuteGetDataAdapter(out intSqlConnectionIndex, CommandType commandType, string commandText, params SqlParameter[]commandParameters)
{
SqlConnection Connection;
Connection = OpenConnection(out Connection, out SqlConnectionIndex);
SqlDataAdapter adapter = new SqlDataAdapter();
using (SqlCommand Command = new SqlCommand(commandText, Connection))
{
Command.CommandType =commandType;
if (commandParameters != null)
{
Command.Parameters.AddRange(commandParameters);
adapter.SelectCommand = Command;
}
else
{
adapter.SelectCommand =Command;
}
}
return adapter;
}
/// <summary>
/// 定义一个Dictionary类型对象,用于存放SqlConnection连接对象
/// </summary>
private static Dictionary<int, SqlConnection> DicList = newDictionary<int, SqlConnection>();
/// <summary>
/// 打开SqlConnection对象的连接并对此连接添加到Dictionary中
/// </summary>
/// <param name="Connection">SqlConnection对象</param>
/// <param name="SqlConnectionIndex">SqlConnection连接对象索引值(用于外部释放索引值对应的SqlConnection连接对象)</param>
/// <returns>SqlConnection对象</returns>
private static SqlConnection OpenConnection(out SqlConnectionConnection, out int SqlConnectionIndex)
{
Connection = new SqlConnection(ConnectionString);
int index = 0;
try
{
if (Connection.State ==ConnectionState.Closed)
{
Connection.Open();
//随机数
Random random = newRandom();
index = random.Next();
//当DicList中Key已存在时
while (DicList.ContainsKey(index))
{
index = random.Next();
}
//向Dictionary中添加Key和Value
DicList.Add(index,Connection);
}
}
catch (Exception ex)
{
ErrorLog(ex);
}
SqlConnectionIndex = index;
return Connection;
}
/// <summary>
/// SQLHelper的DisposeConnection方法,在外部手动释放SqlConnection对象的连接资源。
/// 释放成功返回1,失败异常返回-1。
/// </summary>
///<param name="SqlConnectionIndex">SqlConnection连接对象索引值(用于外部释放索引值对应的SqlConnection连接对象)</param>
public static int DisposeConnection(ref int SqlConnectionIndex)
{
try
{
SqlConnection Connection =DicList[SqlConnectionIndex];
if (Connection.State ==ConnectionState.Open)
{
Connection.Close();
Connection.Dispose();
DicList.Remove(SqlConnectionIndex);
return 1;
}
else
{
return -1;
}
}
catch (Exception ex)
{
ErrorLog(ex);
return -1;
}
}
/// <summary>
/// SQLHelper辅助方法,记录错误日志
/// </summary>
/// <param name="ex">Exception</param>
public static void ErrorLog(Exception ex)
{
File.AppendAllText("ErrorLog.txt",string.Format("\r\n\r\n-> {0}\r\n\t{1}\r\n{2}\r\n{3}",DateTime.Now, ex.Message, ex.Source, ex.StackTrace), Encoding.UTF8);
}
}
}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------