大家或许知道动态网页就是需要和服务器做交互,并且有数据交互的,所以基本会用到数据库,世界上有很多种数据库,但现在最流行的基本是以结构化语句(SQL)作为标准化的关系型数据库,比如IBM的DB2、微软的SQL Server数据库和Access数据库甲骨文的Orale数据库、原Sun公司的MySql数据库(Sun被甲骨文收购了,现在的MySql数据库版权归甲骨文公司所有,但M7在这里把他归属于Sun公司,可以看作是一种历史)、Sybase公司的Sybase数据库等等,这些都是平时开发比较常用的数据库,而我等下要公布的超级DBHelper是建立在SQL Server数据库基础上的,当然聪明的朋友可以在using引入的类库中其他数据库的Connection对象,这样就能成为万能的DBHelper。
注意:
1 要使用SqlConnection对象必须先引入SqlClient命名空间,SqlClinent是一个连接SQL Server数据库的方法的“集合”,里面有很多种方法只是针对SQL Server数据库,继承于Data命名空间,Data命名空间可以看作是所有数据库方法的父类,里面包含7种命名空间,有连接Orale数据库的命名空间OleDb等等。
using System.Data.SqlClient;
2 DBHelper一般是作为数据访问层(DAL)的一个类,也可以看做是一个写了很多种方法的“接口”,里面写了很多种方法便于DAL层中的很多类来实现,这样谁要用到这个方法就调用DBHelper中的这个方法,减少代码的冗余。
3 访问数据库的数据库名、账户、密码、域名等等都将存放在Web.config配置文件中,因为外部是无法访问或下载Web.confige文件的,而且在不同配置的服务器中可能密码或者账户不同,所以可以先在配置文件中配置多个数据,只要在DBHelper文件中修改引入的Name就行了,很方便的一个使用方法,所以必须先在DAl层中点击右键——添加引用,会出现一个窗体,如图:
然后在.NET中寻找System.Configuration,找到之后选中,点击确定,完成。
4 或许有人要问,上面的添加引用是干什么的?不添加引用,我们在using引入中找不到Configuration命名空间,因为我在上面也会说了,我们要把密码等一系列安全级别较高的数据存放在配置文件中,这个命名空间的方法是为了在类中读取配置文件的,所以必须先添加引用,然后在DB类中引入空间:
using System.Configuration;
5 以上两个命名空间成功引入就可以写代码了,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
namespace TestPrj //空间名字 TestPrj
{
public class DBHelper //类名 DBHelper
{
private static string connStr = ConfigurationManager.ConnectionStrings["sqlserver"].ConnectionString;
private static SqlConnection conn;
public static SqlConnection Conn
{
get
{
if (conn == null)
{
conn = new SqlConnection(connStr);
conn.Open();
}
if (conn != null && conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Open();
}
else
{
conn.Open();
}
return DBHelper.conn;
}
}
/// <summary>
/// 关闭连接
/// </summary>
public static void closeConn()
{
if (Conn != null && Conn.State != ConnectionState.Closed)
{
Conn.Close();
}
}
/// <summary>
/// 查询操作
/// </summary>
/// <param name="sql"></param>
/// <param name="type"></param>
/// <param name="pars"></param>
/// <returns></returns>
public static SqlDataReader getReader(string sql, CommandType type, params SqlParameter[] pars)
{
SqlCommand cmd = new SqlCommand(sql, Conn);
cmd.CommandType = type;
cmd.Parameters.AddRange(pars);
return cmd.ExecuteReader();
}
/// <summary>
/// 执行非查询操作(执行增、删、改操作的),不支持事务
/// </summary>
/// <param name="sql"></param>
/// <param name="type"></param>
/// <param name="pars"></param>
/// <returns></returns>
public static int ExecuteNoneQuery(string sql, CommandType type, params SqlParameter[] pars)
{
int result = 0;
SqlCommand cmd = new SqlCommand(sql, Conn);
cmd.CommandType = type;
if (pars != null)
{
cmd.Parameters.AddRange(pars);
}
result = cmd.ExecuteNonQuery();
//关闭连接对象
CloseConn();
return result;
}
/// <summary>
/// 非查询操作(执行增、删、改操作的),支持事务,进行批量操作
/// </summary>
/// <param name="sql"></param>
/// <param name="conn"></param>
/// <param name="type"></param>
/// <param name="pars"></param>
/// <returns></returns>
public static int ExecuteNoneQuery(string sql, SqlConnection conn, CommandType type, params SqlParameter[] pars)
{
int result = 0;
//接受外部提供的数据连接对象,并且此连接在本次操作后不要关闭
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.CommandType = type;
cmd.Parameters.AddRange(pars);
result = cmd.ExecuteNonQuery();
return result;
}
/// <summary>
/// 获取单个值,首行首列
/// </summary>
/// <param name="sql"></param>
/// <param name="type"></param>
/// <param name="pars"></param>
/// <returns></returns>
public static object GetScalar(string sql, CommandType type, params SqlParameter[] pars)
{
object obj = null;
SqlCommand cmd = new SqlCommand(sql, Conn);
cmd.CommandType = type;
cmd.Parameters.AddRange(pars);
obj = cmd.ExecuteScalar();
//关闭连接对象
CloseConn();
return obj;
}
}
}
//ConfigurationManager 方法:提供对客户端应用程序配置文件的访问,也就是说必须通过这个方法才能访问Web.config配置文件
//ConnectionStrings 方法有什么用,干什么的?我们来看张图你就明白了,打开配置文件找到子节点<ConnectionStrings/>如图:
//代码修改如下:<ConnectionStrings>
// <add name="你要调用的名字" connectionString="数据库连接对象—— 服务器名 账户 密码 数据库名" />
// </ConnectionStrings>
// 所以这句你自然就看的懂了 ConfigurationManager.ConnectionStrings["sqlserver"].ConnectionString;
// 在客户端访问配置文件的方法 点(.) 配置文件中的子节点 ["子节点中的名字"] 点(.) 相对的子节点中的内容;
//其中的<add > 可以有多个,name 不能重复,其实name就等于Key ,而后面的ConnectionString就等于Value值。
//用于配置不同的服务器名账户密码,因为你开发一个项目可能你的服务器名字密码是sa sa. 但是别人的不一定是这样的,当你的项目在别人的机器上用的时候,只需要之前在添加个<add>,把别人的账户密码存放在ConnectionString中就行了,到时候在DB中把访问配置文件的名字改成刚添加的<add>中的name就行了,很方便。
//上面有3个判断,连接对象是否为空?连接对象的状态是否为断开?连接对象是否为关闭?
//如果是空的话,就实例化,然后在利用(Open())方法打开连接对象。
//如果在断开状态,就先关闭,在打开,一定要先关闭,断开不等于关闭,这个要注意。
//如果是关闭的话,也就是说连接对象已经实例化成功,但没有开启,要用就要开启,所以直接打开就行了。
//下面还有个关闭的方法
//也会做个判断 是否实例化了,没有实例化自然没有打开,如果强行关闭肯定会抛异常,所以关闭前必须做判断,当然如果本来就是关闭的状态,在去关闭肯定也会抛异常,所以我们做了这个综合性的判断,不在这两者状态下我们才去关闭连接对象。
联系客服