一步步写自己SqlHelper类库(四):Connection对象

1.Connection对象基础

我们知道.NET Framework 数据提供程序包括四个核心对象Connection,Command,DataReader,DataAdapter。而上一章节谈到了连接字符串,现在前提条件有了,Connection对象就是时候出场了!

Connection 对象主要是开启程序和数据库之间的连接。没有利用Connection对象将数据库打开,是无法从数据库中取得数据的。如果把数据源比作大门,那么连接字符串则是钥匙,而连接对象则是拿着钥匙开门的人。

对于ADO.NET,不同的数据源,对应着不同的Connection对象。具体Connection对象如下表:

名称 命名空间 描述
SqlConnection System.Data.SqlClient 表示与SQL Server的连接对象
OleDbConnection System.Data.OleDb 表示与OleDb数据源的连接对象
OdbcConnection System.Data.Odbc 表示与ODBC数据源的连接对象
OracleConnection System.Data.OracleClient 表示与Orale数据库的连接对象


2.Connection对象属性,方法和事件(以SqlConnection为例)

  2.1 属性   

属性 说明
connectionstring 其返回类型为string,获取或设置用于打开 sql server 数据库的字符串。
connectiontimeout 其返回类型为int,获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。
database 其返回类型为string,获取当前数据库或连接打开后要使用的数据库的名称。
datasource 其返回类型为string,获取要连接的 sql server 实例的名称。
state 其返回类型为connectionstate,取得当前的连接状态:broken、closed、connecting、fetching或open。
serverversion 其返回类型为string,获取包含客户端连接的 sql server 实例的版本的字符串。
packetsize 获取用来与 sql server 的实例通信的网络数据包的大小(以字节为单位)。这个属性只适用于sqlconnection类型

  2.2 方法

方法 说明
close() 其返回类型为void,关闭与数据库的连接。
Dispose() 释放由 Component 使用的所有资源
open() 其返回类型为void,用连接字符串属性指定的属性打开数据库连接

  

  2.3 事件

事件 说明
statechange 当事件状态更改时发生。 (从 dbconnection 继承。)
infomessage 当 sql server 返回一个警告或信息性消息时发生。

 

3.使用Connection对象

  由Connection对象中的state属性可以判断当前应用程序与数据源的连接状态。ConnectionState是一个枚举类型。它包括以下成员:

  Closed: 连接处于关闭状态。

  Open: 连接处于打开状态。

  Connecting: 连接对象正在与数据源连接。

  Executing: 连接对象正在执行命令。

      Fetching: 连接对象正在检索数据。

      Broken: 与数据源的连接中断。

  步骤:

  1.首先生成一个SqlConnection的对象conn

  2.判断conn的State状态是否为打开状态,如果不是,则调用Open方法打开数据库

  3.同理,关闭数据也是这样操作

 

SqlConnection conn = new SqlConnection();
if (conn.State != ConnectionState.Open)
{
      conn.Open();
}
if (conn.State == ConnectionState.Open)
{
      conn.Close();
}

4.注意要点可米小子

(1)添加try...catch块

  我们知道连接数据库时,可能出现异常,因此需要添加异常处理。对于C#来说,典型的异常处理是添加try...catch代码块。finially是可选的。finially是指无论代码是否出现异常都会执行的代码块。而对数据库连接资源来说,是非常宝贵的。因此,我们应当确保打开连接后,无论是否出现异常,都应该关闭连接和释放资源。所以,我们必须在finially语句块中调用Close方法关闭数据库连接。

  

SqlConnection conn = new SqlConnection();
 try
 {
       conn.Open();
 }
 catch(Exception ex)
 {
       
 }
 finially
 {
      conn.Close();
 }

  

(2)使用using语句

  using语句的作用是确保资源使用后,并很快释放它们。using语句帮助减少意外的运行时错误带来的潜在问题,它整洁地包装了资源的使用。具体来说,它执行以下内容:

  • 分配资源。
  • 把Statement放进try块。
  • 创建资源的Dispose方法,并把它放进finally块。

   因此,上面的语句等同于:

  

using(SqlConnection conn = new SqlConnection())
{

}

5.SqlHelper类

  对Connection对象有一定的了解后,我们可以简单地写出打开,关闭数据库的操作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

/// <summary>
///SqlHelper create by TerryChan 2012-04-21
/// </summary>
public class SqlHelper
{
    #region 全局配置
    /// <summary>
    /// 连接字符串
    /// </summary> 
    public readonly static string connectionString = ConfigurationManager.ConnectionStrings["connstring"].ToString();

    /// <summary>
    /// SqlConnection对象
    /// </summary> 
    private static SqlConnection conn = new SqlConnection(connectionString);

    #endregion

    #region 打开数据库
    /// <summary>
    /// 打开数据库
    /// </summary>
    public static void OpenConnection()
    {
        if (conn.State != ConnectionState.Open)
        {
            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
                conn.Dispose();
                throw new Exception("打开数据库失败!" + ex.Message);
            }
        }
    }
    #endregion

    #region 关闭数据库
    /// <summary>
    /// 关闭数据库
    /// </summary>
    public static void CloseConnection()
    {
        if (conn.State == ConnectionState.Open)
        {
            try
            {
                conn.Close();
            }
            catch (Exception ex)
            {
                conn.Dispose();
                throw new Exception("关闭数据库失败!" + ex.Message);
            }
        }
    }
    #endregion
}

   

    

作者: ForEvErNoME
出处: http://www.cnblogs.com/ForEvErNoME/
欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能 推荐关注
 
 
 
 
 
原文地址:https://www.cnblogs.com/ForEvErNoME/p/2460719.html