C# ASP.NET 通用权限管理系统组件的数据访问层的调用方法参考1 - 基本功能

时间:2021-10-27 15:30:20

文章写后放在网上,需要查询资料的可以扫一眼,若能有参考价值,别忘记留言!项目中的源码位置如图:

C# ASP.NET 通用权限管理系统组件的数据访问层的调用方法参考1 - 基本功能

1:支持多种数据库。

//-----------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2012 , Hairihan TECH, Ltd. 
//-----------------------------------------------------------------

namespace DotNet.Utilities
{
    /// <summary>
    /// CurrentDbType
    /// 有关数据库连接类型定义。
    /// 
    /// 修改纪录
    /// 
    ///        2011.02.22 版本:3.1 JiRiGaLa 转移文件位置,还是不换为好。
    ///        2007.04.14 版本:3.0 JiRiGaLa 检查程序格式通过,不再进行修改主键操作。
    ///        2006.11.17 版本:2.1 JiRiGaLa 变量命规范化。
    ///        2006.04.18 版本:2.0 JiRiGaLa 重新调整主键的规范化。
    ///        
    /// 版本:3.1
    /// 
    /// <author>
    ///        <name>JiRiGaLa</name>
    ///        <date>2011.02.22</date>
    /// </author> 
    /// </summary>
    public enum CurrentDbType
    {
        /// <summary>
        /// 数据库类型:Oracle
        /// </summary>
        Oracle,
 
        /// <summary>
        /// 数据库类型:SqlServer
        /// </summary>
        SqlServer,
        
        /// <summary>
        /// 数据库类型:Access
        /// </summary>
        Access,
        /// <summary>
        /// 数据库类型:DB2
        /// </summary>
        
        DB2,
        /// <summary>
        /// 数据库类型:MySql
        /// </summary>
        MySql,

        /// <summary>
        /// 数据库类型:SQLite
        /// </summary>
        SQLite,

        /// <summary>
        /// 数据库类型:Ase
        /// </summary>
        Ase,

        /// <summary>
        /// 数据库类型:PostgreSql
        /// </summary>
        PostgreSql
    }
}

2:写法统一,写一套代码跑多个数据库。

3:支持数据库事务回滚。

4:长期在优化维护。

//--------------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd. 
//--------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;

namespace DotNet.WebForm.Example
{
    using DotNet.Business;
    using DotNet.Utilities;
    
    /// <remarks>
    /// ExampleDbHelper
    /// 
    /// 修改纪录
    /// 
    ///     版本:3.0 2013.02.01    JiRiGaLa    写个比较完善的例子程序。
    ///     版本:2.0 2011.02.20    JiRiGaLa    整理完善例子程序。
    ///        版本:1.0 2009.12.17    JiRiGaLa    创建。
    ///    
    /// 版本:1.0
    /// <author>
    ///        <name>JiRiGaLa</name>
    ///        <date>2013.02.01</date>
    /// </author> 
    /// </remarks>
    public partial class ExampleDbHelper : System.Web.UI.Page
    {
        /// <summary>
        ///  一、静态数据库访问组件、快速执行某个SQL语句,自动打开关闭数据,自动读取配置文件。
        ///     这里连接了那个数据库,哪个类型的数据库,连接串等是通过配置文件里配置。
        ///     程序启动时,通过Global文件里代码读取到了静态全局变量的。
        ///     BaseSystemInfo.BusinessDbConnection // 业务数据库。
        ///     BaseSystemInfo.DataBaseType // 有关数据库连接类型定义。
        ///     可以连续执行任意多个SQL语句,当然可以带参数方式的,运行存储过程等等,都应该有相应的函数。
        ///     
        ///     优点:
        ///     不需要自己 Open Close 数据库了,调用比较简便
        /// </summary>
        private void DbHelperStatic()
        {
            // 这个辅助工具类能自动连接到 配置文件的 BusinessDbConnection 上
            DbHelper.ExecuteNonQuery("SELECT COUNT(1) FROM BaseUser");
            DbHelper.ExecuteNonQuery("SELECT COUNT(1) FROM BaseUser");
            DbHelper.Fill("SELECT Id FROM BaseUser");
            DbHelper.Fill("SELECT Id FROM BaseUser");

            // 执行参数化的例子,网站防注入攻击的
            IDbDataParameter[] dbParameters = new IDbDataParameter[] { DbHelper.MakeParameter("Id", 5) };
            string commandText = "SELECT Id FROM BaseUser WHERE Id > " + DbHelper.GetParameter("Id");
            DbHelper.Fill(commandText, dbParameters, CommandType.Text);

            DbHelper.ExecuteScalar("SELECT COUNT(1) FROM BaseUser");
            DbHelper.ExecuteScalar("SELECT COUNT(1) FROM BaseUser");
            // 这里需要验证的是能自动关闭数据库连接
            IDataReader dataReader1 = DbHelper.ExecuteReader("SELECT Id FROM BaseUser");
            while (dataReader1.Read())
            {
            }
            dataReader1.Close();
            IDataReader dataReader2 = DbHelper.ExecuteReader("SELECT Id FROM BaseUser");
            while (dataReader2.Read())
            {
            }
            dataReader2.Close();
            
            // 下面这个是自己可以控制的运行方式,用程序方式设置数据库连接字符串 
            // 从通用权限管理系统的全局文件读取数据库配置
            DbHelper.DbConnection = BaseSystemInfo.BusinessDbConnection;
            // 设置数据库类型
            DbHelper.DbType = CurrentDbType.SqlServer;

            BaseSystemInfo.BusinessDbConnection = "Data Source=JIRIGALA-PC\\SQLEXPRESS;Initial Catalog=ConvenienceServices;Integrated Security=SSPI;";
            DbHelper.DbConnection = "Data Source=localhost;Initial Catalog=UserCenterV37;User Id = sa ; Password = Password@sa;";
            // 用读取配置文件的方式设置数据库连接串
            DbHelper.DbConnection = ConfigurationManager.AppSettings["BusinessDbConnection"];
            DbHelper.Fill("SELECT Id FROM BaseUser");

            // 获取数据库当前时间
            this.Title = DbHelper.ExecuteScalar("SELECT " + DbHelper.GetDBNow()).ToString();
            this.Title = DbHelper.GetDBDateTime();
        }

        /// <summary>
        /// 数据库事务回滚的例子
        /// 
        /// 二、需要支持数据库事务的例子,单个数据的事务应该是建立在一个数据库连接打开与关闭之间,
        ///     不可能在多个打开关闭之间进行事务控制的。
        ///     所以多个SQL语句的执行时的数据库打开关闭是自己控制的,当然有更灵活的需要,可以直接用微软的底层的方法。
        ///     通常的业务处理过程中,用这样的方法,工作效率会更高一些。
        /// </summary>
        private void DbHelperTransaction()
        {
            IDbHelper dbHelper = new SqlHelper(ConfigurationManager.AppSettings["BusinessDbConnection"]);
            try
            {
                dbHelper.Open();
                dbHelper.BeginTransaction();
                dbHelper.ExecuteNonQuery("UPDATE BaseUser SET CreateOn = GETDATE()");
                dbHelper.ExecuteNonQuery("UPDATE BaseUser SET ModifiedOn = GETDATE()");
                // 这里会出错,需要数据库的更新都能回滚才可以
                dbHelper.ExecuteNonQuery("UPDATE BaseUser SET SortCode = 'abc'");
                dbHelper.CommitTransaction();
            }
            catch (System.Exception exception)
            {
                dbHelper.RollbackTransaction();
                // throw exception;
            }
            finally
            {
                dbHelper.Close();
            }
        }

        /// <summary>
        /// 调用储存过程的
        /// </summary>
        private void DbHelperStoredProcedure()
        {
            DbHelper.Fill("ExportData", new IDbDataParameter[] { DbHelper.MakeParameter("tableName", "BaseUser") }, CommandType.StoredProcedure);
        }

        /// <summary>
        /// 执行数据库脚本
        /// </summary>
        private void ExecuteSql()
        {
            // 通过接口定义,打开一个数据库
            IDbHelper dbHelper = new SqlHelper();
            // 按指定的数据库连接串,打开数据库连接
            dbHelper.Open("Data Source=localhost;Initial Catalog=UserCenterV37;User Id = sa ; Password = Password@sa;");
            this.ExecuteSql(dbHelper);
            // 关闭数据库连接
            dbHelper.Close();
        }

        /// <summary>
        /// 执行SQL语句,按接口的方式不指定特定数据库的方式写程序
        /// </summary>
        /// <param name="dbHelper">数据库连接</param>
        private void ExecuteSql(IDbHelper dbHelper)
        {
            string[] values = new string[] { "10000000", "10000900", "10000904" };
            List<KeyValuePair<string, object>> parameters = new List<KeyValuePair<string, object>>();
            parameters.Add(new KeyValuePair<string, object>(BaseUserEntity.FieldId, values));
            parameters.Add(new KeyValuePair<string, object>(BaseUserEntity.FieldDeletionStateCode, 0));
            BaseUserManager manager = new BaseUserManager(dbHelper);
            // 这个是用管理器进行 自动的SQL语句转换的例子
            DataTable dataTable = manager.GetDataTable(parameters);
            this.Title = dataTable.Rows.Count.ToString();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            // 静态调用数据库的方法
            DbHelperStatic();

            // 数据库事务回滚的例子
            DbHelperTransaction();

            // 调用储存过程的
            DbHelperStoredProcedure();

            // 执行脚本
            this.ExecuteSql();
        }
    }
}