sqlHelper

  • 格式:doc
  • 大小:106.50 KB
  • 文档页数:15

SqlHelper代码、功能、用法介绍数据访问组件SqlHelper数据访问组件是一组通用的访问数据库的代码,在所有项目中都可以用,一般不需要修改。

本节使用的是Microsoft提供的数据访问助手,其封装很严密,且应用简单。

首先要先添加一个类,并命名为SqlHelper,系统会提示是否将类放在App_Code文件夹中。

此时一定要选择“是”,因为放在此文件夹下,系统会自动进行编译,程序员就可以直接使用,无需另外编译了。

SqlHelper的功能SqlHelper的目的是从数据库获得信息或将信息保存到数据库。

本实例的SqlHelper 主要功能如下。

(1)执行不返回数据的T-Sql命令。

例如修改会员卡信息、添加会员资料等。

(2)返回一个字段的T-Sql命令。

例如获取会员卡类型的积分规则。

(3)返回一组数据。

例如获取会员资料、获取所有会员卡类型等。

(4)缓存参数列表。

在执行一条语句时,可能有多个参数,为了提高速度,将参数缓存。

(5)读取缓存的参数。

下面用图表的方式描述SqlHelper类的功能,如图7-16所示。

图7-16 SqlHelper功能图小结本文主要介绍了如何在Visual Studio 2005中新建网站项目,如何使用版本控制工具管理网站的源代码,以及母版页、导航地图和皮肤文件的使用。

导航地图中以XML文件为数据源,TreeView为展现形式。

除了需要在XML文件中手动填写模块功能外,其他都可以自动实现,这就是 2.0的最大好处。

代码量的减少给开发人员带来了极大的便利。

SqlHelper的小知识SqlHelper是一个微软完全开放源码的数据库操作类,用于简化你重复的去写那些数据库连接(DbConnection)啊,DbCommand,DbDataReader等等。

SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。

SqlHelper 类实现详细信息SqlHelper 类用于通过一组静态方法来封装数据访问功能。

该类不能被继承或实例化,因此将其声明为包含专用构造函数的不可继承类。

在SqlHelper 类中实现的每种方法都提供了一组一致的重载。

这提供了一种很好的使用SqlHelper 类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。

每种方法的重载都支持不同的方法参数,因此开发人员可以确定传递连接、事务和参数信息的方式。

在SqlHelper 类中实现的方法包括:ExecuteNonQuery。

此方法用于执行不返回任何行或值的命令。

这些命令通常用于执行数据库更新,但也可用于返回存储过程的输出参数。

ExecuteReader。

此方法用于返回SqlDataReader 对象,该对象包含由某一命令返回的结果集。

ExecuteDataset。

此方法返回DataSet 对象,该对象包含由某一命令返回的结果集。

ExecuteScalar。

此方法返回一个值。

该值始终是该命令返回的第一行的第一列。

ExecuteXmlReader。

此方法返回FOR XML 查询的XML 片段。

除了这些公共方法外,SqlHelper 类还包含一些专用函数,用于管理参数和准备要执行的命令。

不管客户端调用什么样的方法实现,所有命令都通过SqlCommand 对象来执行。

在SqlCommand 对象能够被执行之前,所有参数都必须添加到Parameters 集合中,并且必须正确设置Connection、CommandType、CommandText 和Transaction 属性。

SqlHelper 类中的专用函数主要用于提供一种一致的方式,以便向SQL Server 数据库发出命令,而不考虑客户端应用程序调用的重载方法实现。

SqlHelper 类中的专用实用程序函数包括:AttachParameters:该函数用于将所有必要的SqlParameter 对象连接到正在运行的SqlCommand。

AssignParameterValues:该函数用于为SqlParameter 对象赋值。

PrepareCommand:该函数用于对命令的属性(如连接、事务环境等)进行初始化。

ExecuteReader:此专用ExecuteReader 实现用于通过适当的CommandBehavior 打开SqlDataReader 对象,以便最有效地管理与阅读器关联的连接的有效期。

执行SQL语句引用完毕后,就可以执行SQL语句,使用SQLHelper执行SQL语句非常方便,下面代码演示了如何执行插入、删除操作。

string strsql = "insert into mynews values ('SQLHelper插入标题')"; //编写SQL语句SQLHelper.ExecNonQuery(strsql); //执行SQL语句上述代码运行后,则会执行插入操作,相比于,封装后的代码更加简便易懂,删除操作代码如下所示。

string strsql2 = "delete form mynews where id=3"; //编写SQL语句SQLHelper.ExecNonQuery(strsql2); //执行SQL语句当需要执行SELECT语句时,可以通过SQLHelper.DataAdapter获取数据,示例代码如下所示。

string strsql = "select * from mynews where id=3"; //编写SQL语句DataSet ds = SQLHelper.DataAdapter(strsql, SQLHelper.SDACmd.select, "mydatatable");上述代码通过SQLHelper.DataAdapter获取数据,并创建了一个mydatatable虚拟表,填充DataSet对象。

当需要获取DataSet对象中的数据时,和普通的DataSet对象一样。

SQLHelper封装了中的许多方法,为开发人员提高了效率,同时也增加了安全性和模块化的特性。

注意:上述代码中的SQLHelper类能够执行的是SQL语句,如果需要执行存储过程,则需要更改SQLHelper类中的相应的CommandType属性的值。

为什么要使用数据访问层?如果不使用数据访问层,那么你的代码里会出现很多SqlConnection、SqlCommand、SqlDataReader、Open、Close……这些类和方法,而且代码量很大,让你不胜其烦,而且代码写起来,其实都是体力活,没有技术含量。

因此我们要把数据访问层封装起来,方便重用。

微软已经替我们做好了这个工作,那就是SqlHelper,下图是SqlHelper的类关系图:下面介绍我的使用方法。

执行一个无返回值的存储过程:create proc p_Delete@id intasdelete table1 where id=@id这是一个删除数据的存储过程,调用该存储过程只需要一句话:SqlHelper.ExecuteNonQuery (SqlHelper.conn, "p_Delete", id);,这里的id是int类型,而不是SqlParameter类型。

该调用是调用的public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)方法。

以此类推。

返回一个DataSet类型:SqlHelper.ExecuteDataset (SqlHelper.conn, pro, 参数列表);参数也是直接传递,无需构造SqlParameter.使用SqlHelperusing System;using System.Collections.Generic;using System.T ext;using System.Data;using System.Data.SqlClient;namespace TestSQL_Project{public class DBPersonSqlHelper{private static readonly string connString = "Data Source=(local);Database=MyTest;Uid=sa;Pwd=123456";/// <summary>/// 添加用户/// </summary>/// <param name="person">要添加的用户</param>public static void AddPerson(Person person){string insertString = "insert into T_Person(p_name,p_age) values(@name,@a ge)";SqlParameter[] cmdParameter = {new SqlParameter("@name", SqlDbType.VarChar),new SqlParameter("@age", SqlDbType.Int)};cmdParameter[0].Value = ;cmdParameter[1].Value = person.Age;try{SqlHelper.ExecuteNonQuery(new SqlConnection(connString), CommandTyp e.Text, insertString, cmdParameter);}catch (Exception ex){Console.WriteLine(ex.ToString());}}/// <summary>/// 通过用户ID删除用户/// </summary>/// <param name="id">要删除的用户的ID</param>public static void DeletePersonByID(int id){string deleteString = "delete from T_Person where p_id = @id";SqlParameter[] cmdParameter = {new SqlParameter("@id", SqlDbType.Int)};cmdParameter[0].Value = id;try{SqlHelper.ExecuteNonQuery(new SqlConnection(connString), CommandTyp e.Text, deleteString, cmdParameter);}catch (Exception ex){Console.WriteLine(ex.ToString());}}/// <summary>/// 更新用户/// </summary>/// <param name="person">要更新的用户</param>public static void UpdatePerson(Person person){string updateString = "update T_Person set p_name = @name,p_age = @a ge where p_id = @id";SqlParameter[] sqlParameter = {new SqlParameter("@id",SqlDbType.Int),new SqlParameter("@name",SqlDbType.VarChar),new SqlParameter("@age", SqlDbType.Int)};sqlParameter[0].Value = person.Id;sqlParameter[1].Value = ;sqlParameter[2].Value = person.Age;try{SqlHelper.ExecuteNonQuery(new SqlConnection(connString), CommandTyp e.Text, updateString, sqlParameter);}catch (Exception ex){Console.WriteLine(ex.ToString());}}/// <summary>/// 通过id取得用户/// </summary>/// <param name="id">要取得的用户的id</param>/// <returns>取得的用户</returns>public static Person GetPersonByID(int id){if (!PersonIsExistById(id)){return null;}Person person = new Person();string selectString = "select * from T_Person where p_id = @id";SqlParameter[] sqlPara = {new SqlParameter("@id",SqlDbType.Int)};sqlPara[0].Value = id;SqlDataReader dr = SqlHelper.ExecuteReader(connString, CommandType.Tex t, selectString, sqlPara);try{while (dr.Read()){person.Id = Convert.ToInt32(dr["p_id"]); = dr["p_name"].ToString();person.Age = Convert.ToInt32(dr["p_age"]);}}catch (Exception ex){Console.WriteLine(ex.ToString());return null;}return person;}/// <summary>/// 取得最大的id/// </summary>/// <returns>如果返回-1表示数据库中没有数据,否则返回的就是最大的id</returns> public static int GetMaxPersonID(){string selectString = "select max(p_id) as maxID from T_Person";object obj = null;obj = SqlHelper.ExecuteScalar(new SqlConnection(connString), CommandTyp e.Text, selectString, null);if (!TableHasRecord()){return -1;}else{return Convert.ToInt32(obj);}}/// <summary>/// 根据id判断用户是否存在/// </summary>/// <param name="id">要判断的用户的id</param>/// <returns>返回true表示该用户存在,返回false表示该用户不存在</returns>public static bool PersonIsExistById(int id){string selectString = "select * from T_Person where p_id = @id";SqlParameter[] sqlPara = {new SqlParameter("@id",SqlDbType.Int)};sqlPara[0].Value = id;SqlDataReader dr = SqlHelper.ExecuteReader(connString, CommandType.Tex t, selectString, sqlPara);while (dr.Read()){return true;}return false;}/// <summary>/// 判断表中是否有数据/// </summary>/// <returns>返回true表示有数据,返回false表示没有数据</returns>public static bool T ableHasRecord(){string selectString = "select * from T_Person";SqlDataReader dr = SqlHelper.ExecuteReader(connString, CommandType.Tex t, selectString, null);while (dr.Read()){return true;}return false;}/// <summary>/// 取得所有用户/// </summary>/// <returns>所有用户的集合</returns>public static List<Person> GetManyPersons(){string selectString = "select * from T_Person";List<Person> lstPerson = new List<Person>();Person person = null;DataSet ds = SqlHelper.ExecuteDataSet(connString, CommandType.Text, sele ctString, null);if (ds.Tables[0].Rows.Count > 0){for (int i = 0; i < ds.Tables[0].Rows.Count; i++){person = new Person();person.Id = Convert.ToInt32(ds.Tables[0].Rows[0]["p_id"].ToString()); = ds.Tables[0].Rows[0]["p_name"].ToString();person.Age = Convert.ToInt32(ds.Tables[0].Rows[0]["p_age"].ToString());lstPerson.Add(person);}}return lstPerson;}}}。