.net中的数据访问层的封装
来源:互联网 发布:mac壁纸怎么设置 编辑:程序博客网 时间:2024/05/22 06:20
当年.net项目中自己封装的数据访问层,个人感觉使用比较方便,供大家参考
在dao层访问时可以如下调用:
public class PersonDao{ SqlDataProvider sql; public PersonDao() { sql = new SqlDataProvider(); } //insert public void addPerson(Person person){ sql.AddSqlComm( "INSERT INTO Person(UserName,Age)" + " SELECT @userName,@age" ); sql.AddParameters("@userName", person.getUserName()); sql.AddParameters("@age", person.getAge()); sql.ExecuteNonQuery(); } //update public void modPerson(Person person){ sql.AddSqlComm( "UPDATE Person " + " SET UserName = @userName AND Age = @age" + " WHERE Id = @id" ); sql.AddParameters("@userName", person.getUserName()); sql.AddParameters("@age", person.getAge()); sql.AddParameters("@id", person.getId()); sql.ExecuteNonQuery(); } //delete public void rmPerson(Person person){ sql.AddSqlComm( "DELETE FROM Person " + " WHERE Id = @id" ); sql.AddParameters("@id", person.getId()); sql.ExecuteNonQuery(); } //select public DataTable getPersonById(int id){ sql.AddSqlComm( "SELECT Id, UserName, Age" + " FROM Person WITH(NOLOCK)" + " where id= @id" ); sql.AddParameters("@id", id); return sql.ExecuteDataTable(); } public DataSet getPeople(){ sql.AddSqlComm( "SELECT Id, UserName, Age" + " FROM Person WITH(NOLOCK)" ); return sql.ExecuteDataSet(); } //sp public void init(int id){ sql.AddSqlComm("usp_init_person"); sql.CommandType = CommandType.StoredProcedure; sql.AddParameters("@id", id); sql.ExecuteNonQuery(); }}
是不是很方便,只要传入简单的SQL语句或者存储过程,就可以调用数据访问层。现在,我们开看一下这个数据访问层的代码实现:
1. 先看文件架构
我们以访问SQL Server数据库为例介绍
2.IDataProvider
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DataProvider{ interface IDataProvider { void AddParameters(string parname, Guid value); void AddParameters(string parname, long value); void AddParameters(string parname, string value); void AddParameters(string parname, string value, DataProvider.StringFamily dateType); void AddParameters(string parname, string value, DataProvider.StringFamily dateType, int size); void AddParameters(string parname, float value); void AddParameters(string parname, decimal value); void AddParameters(string parname, DateTime value, DataProvider.DateFamily dateType); void AddParameters(string parname, int value); void AddParameters(string parname, object value); void AddParameters(string parname, byte[] value, DataProvider.ByteArrayFamily dateType); void AddParameters(string parname, bool value); void AddParameters(string parname, short value); void AddParameters(string parname, byte value); System.Data.CommandType CommandType { get; set; } string ConnectionString { get; } System.Data.DataSet ExecuteDataSet(); System.Data.DataTable ExecuteDataTable(); void ExecuteReader(ReadData readData); int ExecuteNonQuery(); object ExecuteScalar(); string SQL { get; set; } } public delegate void ReadData(System.Data.IDataReader dataReadre);}
3.SqlDataProvider
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Configuration;namespace DataProvider.SqlDataProvider{ /// <summary> /// SQL数据提供者的实现 /// </summary> public class SqlDataProvider : IDataProvider { //数据库连接字符串 string connstr; private static System.Data.SqlClient.SqlConnection conn; private System.Data.SqlClient.SqlCommand cmd; public SqlDataProvider() { connstr = ConfigurationManager.ConnectionStrings["SQLCONN"].ToString(); } public SqlDataProvider(string userDefinedConnStr) { connstr = ConfigurationManager.ConnectionStrings[userDefinedConnStr].ToString(); } public SqlDataProvider(string connstr, string sql) { conn = new System.Data.SqlClient.SqlConnection(connstr); cmd = new System.Data.SqlClient.SqlCommand(); cmd.Connection = conn; cmd.CommandText = sql; cmd.CommandTimeout = 0; } public void SetConn(String conn) { connstr = ConfigurationManager.ConnectionStrings[conn].ToString(); } /// <summary> /// 当工厂生产好数据访问对象后,用这个方法向对象输入sql语句 /// </summary> /// <param name="sql"></param> public void AddSqlComm(String sql) { conn = new System.Data.SqlClient.SqlConnection(connstr); cmd = new System.Data.SqlClient.SqlCommand(); cmd.Connection = conn; cmd.CommandText = sql; cmd.CommandTimeout = 0; } /// <summary> /// 需要执行的SQL命令 /// </summary> public string SQL { set { cmd.CommandText = value; } get { return cmd.CommandText; } } /// <summary> /// 当前的连接字符串 /// </summary> public string ConnectionString { get { return conn.ConnectionString; } } /// <summary> /// 设置命令的类型 /// </summary> public System.Data.CommandType CommandType { set { cmd.CommandType = value; } get { return cmd.CommandType; } } /// <summary> /// 添加一个Variant类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, object value) { cmd.Parameters.Add(parname, System.Data.SqlDbType.Variant).Value = value; } /// <summary> /// 添加一个Bit类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, bool value) { cmd.Parameters.Add(parname, System.Data.SqlDbType.Bit).Value = value; } /// <summary> /// 添加一个TinyInt类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, byte value) { cmd.Parameters.Add(parname, System.Data.SqlDbType.TinyInt).Value = value; } /// <summary> /// 添加一个SmallInt类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, short value) { cmd.Parameters.Add(parname, System.Data.SqlDbType.SmallInt).Value = value; } /// <summary> /// 添加一个Int类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, int value) { cmd.Parameters.Add(parname, System.Data.SqlDbType.Int).Value = value; } /// <summary> /// 添加一个Int类型数据输出参数 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddOutputParameters(string parname) { cmd.Parameters.Add(parname, System.Data.SqlDbType.Int).Direction = ParameterDirection.Output; } /// <summary> /// 添加一个BigInt类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, long value) { cmd.Parameters.Add(parname, System.Data.SqlDbType.BigInt).Value = value; } /// <summary> /// 添加一个字节数组族类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> /// <param name="dateType"></param> public void AddParameters(string parname, byte[] value, ByteArrayFamily dateType) { cmd.Parameters.Add(parname, DataTypeAdapter.ConvertSqlDbType(dateType)).Value = value; } /// <summary> /// 添加一个字符类型数据,默认是NVarChar,长度是value.Length /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, string value) { AddParameters(parname, value, StringFamily.NVarChar, value.Length); } /// <summary> /// /// </summary> /// <param name="parname"></param> /// <param name="value"></param> /// <param name="length"></param> public void AddParameters(string parname, string value, int size) { AddParameters(parname, value, StringFamily.NVarChar, size); } /// <summary> /// 添加一个字符族类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> /// <param name="dateType"></param> /// <param name="length"></param> public void AddParameters(string parname, string value, StringFamily dateType) { AddParameters(parname, value, dateType, value.Length); } /// <summary> /// 添加一个字符族类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> /// <param name="dateType"></param> /// <param name="size"></param> public void AddParameters(string parname, string value, StringFamily dateType, int size) { cmd.Parameters.Add(parname, DataTypeAdapter.ConvertSqlDbType(dateType), size).Value = value; } /// <summary> /// 添加一个日期族类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> /// <param name="dateType"></param> public void AddParameters(string parname, DateTime value, DateFamily dateType) { cmd.Parameters.Add(parname, DataTypeAdapter.ConvertSqlDbType(dateType)).Value = value; } /// <summary> /// 添加一个Decimal类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, decimal value) { cmd.Parameters.Add(parname, System.Data.SqlDbType.Decimal).Value = value; } /// <summary> /// 添加Float类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, float value) { cmd.Parameters.Add(parname, System.Data.SqlDbType.Float).Value = value; } /// <summary> /// 添加一个UniqueIdentifier类型数据 /// </summary> /// <param name="parname"></param> /// <param name="value"></param> public void AddParameters(string parname, System.Guid value) { cmd.Parameters.Add(parname, System.Data.SqlDbType.UniqueIdentifier).Value = value; } /// <summary> /// 将SqlDataReader提交给具体的委托器处理 /// </summary> /// <param name="readData"></param> public void ExecuteReader(ReadData readData) { using (conn) { conn.Open(); System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader(); readData(dr); conn.Close(); } } /// <summary> /// 对连接执行 Transact-SQL 语句并返回受影响的行数 /// </summary> /// <returns></returns> public int ExecuteNonQuery() { int result = -1; using (conn) { conn.Open(); result = cmd.ExecuteNonQuery(); conn.Close(); } return result; } /// <summary> /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行 /// </summary> /// <returns></returns> public object ExecuteScalar() { object result = null; using (conn) { conn.Open(); result = cmd.ExecuteScalar(); conn.Close(); } return result; } /// <summary> /// 执行查询,并返回查询的DataSet /// </summary> /// <returns></returns> public System.Data.DataSet ExecuteDataSet() { System.Data.DataSet datadet = new System.Data.DataSet(); using (conn) { System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(); adapter.SelectCommand = cmd; conn.Open(); adapter.Fill(datadet); conn.Close(); } return datadet; } /// <summary> /// 执行查询,并返回查询的Table /// </summary> /// <param name="tableIndex"></param> /// <returns></returns> public System.Data.DataTable ExecuteDataSet(int tableIndex) { System.Data.DataSet datadet = ExecuteDataSet(); if (datadet.Tables.Count > 0 && tableIndex < datadet.Tables.Count) { return datadet.Tables[tableIndex]; } else { return null; } } /// <summary> /// 执行查询,并返回查询的Table /// </summary> /// <returns></returns> public System.Data.DataTable ExecuteDataTable() { System.Data.DataTable table = new System.Data.DataTable(); using (conn) { System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(); adapter.SelectCommand = cmd; conn.Open(); adapter.Fill(table); conn.Close(); } return table; } /// <summary> /// 带事务的执行 /// </summary> /// <param name="sqlDataHelper">>需要执行的一组SqlDataProvider</param> /// <param name="errorDataProviderIndex">执行中有错误的SqlDataProvider对象索引</param> public static void ExecuteTransaction(SqlDataProvider[] sqlDataHelpers, out int errorDataProviderIndex) { ExecuteTransaction(sqlDataHelpers, out errorDataProviderIndex, false); } /// <summary> /// 带事务的执行 /// </summary> /// <param name="sqlDataHelper">需要执行的一组SqlDataProvider</param> /// <param name="errorDataProviderIndex">执行中有错误的SqlDataProvider对象索引</param> /// <param name="strict">是否要严格计算执行返回行</param> public static void ExecuteTransaction(SqlDataProvider[] sqlDataHelpers, out int errorDataProviderIndex, bool strict) { errorDataProviderIndex = -1; using (conn) { conn.Open(); //默认的事物不隔离,安全 System.Data.SqlClient.SqlTransaction transaction = conn.BeginTransaction(); for (int i = 0; i <= sqlDataHelpers.Length - 1; i++) { //设置事务,只有在这个内部才可以设置 sqlDataHelpers[i].cmd.Transaction = transaction; sqlDataHelpers[i].cmd.Connection = conn; try { if (strict && sqlDataHelpers[i].ExecuteNonQuery() == 0)//需要严格执行 { errorDataProviderIndex = i;//错误的执行索引 throw new System.Exception("有执行语句没有返回有效行数"); } } catch (System.Exception e) { transaction.Rollback(); throw new System.Exception("语句执行中有意外错误", e); } finally { } } conn.Close(); transaction.Commit(); } } }}
4.DataTypeAdapter
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DataProvider.SqlDataProvider{ /// <summary> /// SqlDbType数据类型和.NET Framework数据类型的适配器 /// </summary> public static class DataTypeAdapter { /// <summary> /// 将.NET Framework数据类型适配为SqlDbType数据类型 /// </summary> /// <param name="data"></param> /// <returns></returns> public static System.Data.SqlDbType ConvertSqlDbType(StringFamily data) { switch (data) { case StringFamily.Char: return System.Data.SqlDbType.Char; case StringFamily.NChar: return System.Data.SqlDbType.NChar; case StringFamily.NText: return System.Data.SqlDbType.NText; case StringFamily.NVarChar: return System.Data.SqlDbType.NVarChar; case StringFamily.Text: return System.Data.SqlDbType.Text; default: return System.Data.SqlDbType.VarChar; } } /// <summary> /// 将.NET Framework数据类型适配为SqlDbType数据类型 /// </summary> /// <param name="data"></param> /// <returns></returns> public static System.Data.SqlDbType ConvertSqlDbType(DateFamily data) { switch (data) { case DateFamily.Date: return System.Data.SqlDbType.Date; case DateFamily.DateTime: return System.Data.SqlDbType.DateTime; case DateFamily.DateTime2: return System.Data.SqlDbType.DateTime2; case DateFamily.DateTimeOffset: return System.Data.SqlDbType.DateTimeOffset; case DateFamily.SmallDateTime: return System.Data.SqlDbType.SmallDateTime; default: return System.Data.SqlDbType.Time; } } /// <summary> /// 将.NET Framework数据类型适配为SqlDbType数据类型 /// </summary> /// <param name="data"></param> /// <returns></returns> public static System.Data.SqlDbType ConvertSqlDbType(ByteArrayFamily data) { switch (data) { case ByteArrayFamily.Binary: return System.Data.SqlDbType.Binary; case ByteArrayFamily.Image: return System.Data.SqlDbType.Image; case ByteArrayFamily.Timestamp: return System.Data.SqlDbType.Timestamp; default: return System.Data.SqlDbType.VarBinary; } } }}
5.DataFamily
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DataProvider{ /// <summary> /// C#对于的SQL类型 /// </summary> public enum StringFamily { Char, NChar, NText, NVarChar, Text, VarChar } /// <summary> /// C#对于的SQL类型 /// </summary> public enum DateFamily { DateTime, SmallDateTime, Date, Time, DateTime2, DateTimeOffset } /// <summary> /// C#对于的SQL类型 /// </summary> public enum ByteArrayFamily { Binary, Image, Timestamp, VarBinary }}
0 0
- .net中的数据访问层的封装
- 封装.Net数据访问层---羽量级Hibernate (连载一)
- C++访问MySQL数据访问层封装
- 数据访问层——字段的封装
- 数据访问层——表结构的封装
- 数据访问层——表操作的封装
- 实战 .Net 数据访问层
- 实战.NET数据访问层
- 封装.Net数据访问层---羽量级Hibernate (连载二---查询及其参数)
- Dapper.NET使用入门(四)【用Dapper数据访问层封装】
- 数据访问的封装
- mojoportal中的数据访问层
- 剖析 .Net 下的数据访问层技术(一)
- 剖析 .Net 下的数据访问层技术(二)
- 剖析 .Net 下的数据访问层技术(三)
- 剖析 .Net 下的数据访问层技术(四)
- 剖析 .Net 下的数据访问层技术(五)
- 剖析 .Net 下的数据访问层技术(六)
- 【JavaScript】 Html 引用 JavaScript
- 中科爱讯WiFi探针的功能与应用
- leetcode 215 Kth Largest Element in an Array C++
- 浏览器端的存储技术有哪些
- mnist数字显示 python实现
- .net中的数据访问层的封装
- 关于DEV中的GridControl使用之GridView
- Spring事务管理TransactionManager
- 磁盘性能测试
- Android模拟器中访问局域网地址
- UILabel标签文字过长时的显示方式
- Codeforces Beta Round #61 (Div. 2) B. Petya and Countryside (DP)
- Dialy —— 2016.12
- XIB中设置UIView圆角