黑马程序员-自学笔记-SQLServer与ADO.Net(五)-SQLHelper

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培训、期待与您交流! ----------------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值