文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>简单跨数据库ADO.NET组件-DAM

简单跨数据库ADO.NET组件-DAM

时间:2011-01-28  来源:Rainr

它的特点:

  1. 在您保证SQL语句兼容的前提下,透过它来访问数据库时,在不需要改变DAL层一点代码的前提下,只要修改一下配置文件,它便可以为你跨不同类型的数据库。
  2. 让你的DAL层代码更见简练。它会根据配置文件配置的连接信息,自动为你创建数据库连接,执行操作。关闭连接,释放连接等.
  3. 让DAL层的不同模块访问不同类型或不同数据库更加方便。
  4. 不错的执行效率,它基于原生ADO.NET。只会反射一次访问不同数据库的ADO提供者的程序集(DAM最终都是通过这些提供者来实现访问不同类型数据库的)。

它的配置:

配置代码 <appsettings> 
  <add key="rpsconnection" value="mssql"/>
  <add key="damconnection" value="sqlite" />
</appsettings>
<connectionstrings>
  <add name="sqlite" connectionString="" providerName="System.Data.SQLite.SQLiteConnection;System.Data.SQLite"/>
  <add name="mssql" connectionString="" providerName="System.Data.SqlClient.SqlConnection;System.Data" />
</connectionstrings>  
appsettings 1.添加一个KV。KEY="damconnection" VALUE="下面connectionstrings中的一个name的一项"."damconnection"为默认的DAM读取的KEY, KEY的名字请不要更换. VALUE的值可以根据您默认连接的数据库连接变而变. 
2.如果想应用多个数据库连接,来访问不同的数据库. 您可以在appsettings中添加别的KV项.代码里使用DAM中Config或者Factroy来创建不同的数据库连接,可以实现访问不同的或不同类型的数据库.

 

connectionstrings 1.项中connectionString值不需要变 
2.项中providerName值分为三个部分 
连接的完整类名  ;  连接类所在的程序集名

 

(命名空间+类名)  (中间用";"分开)  (注意不加.dll)  

 

 

测试代码:

 DAL层测试代码

/// <summary>
    /// 数据访问层
    /// 透过Dam访问数据库
    /// </summary>
    public class DALTest
    {
        /// <summary>
        /// 最简单的插入操作
        /// Execute会帮你自动创建所对应数据库的连接、执行操作、释放Command、关闭连接、释放链接等
        /// </summary>
        /// <returns>执行后受影响行数</returns>
        public int Insert()
        {
            return Execute.SExecuteNonQuery("sp_name", null);
            //return Execute.SExecuteNonQuery("insert into tablename (..) values (..)", CommandType.Text , null);
        }

        /// <summary>
        /// 带参数的插入操作
        /// Execute会帮你自动创建所对应数据库的连接
        /// 并帮你把参数类型转换为所对应数据库类型的参数进行数据库操作.
        /// </summary>
        /// <returns></returns>
        public int Insert_Paras()
        {
            DbParameter[] paras = 
            {
                new MySqlParameter("p1","p1value")
                ,new SqlParameter("p2","p2value")
            };
            return Execute.SExecuteNonQuery("sp_name", paras);
        }

        /// <summary>
        /// 带参数的插入操作,并能得到参数返回值
        /// Execute会帮你自动创建所对应数据库的连接
        /// 并帮你把参数类型转换为所对应数据库类型的参数进行数据库操作.
        /// 执行完成您可得到返回值
        /// </summary>
        /// <returns></returns>
        public int Insert_Paras(ref string outputValue)
        {
            int resultInt = 0;
            DbParameter[] paras = 
            {
                new MySqlParameter("p1","p1value")
                ,new SqlParameter("p2_output","")
                {
                     Direction = ParameterDirection.Output
                }
            };
            resultInt = Execute.SExecuteNonQuery("sp_name", paras);
            if (paras[1].Value != null) outputValue = paras[1].Value.ToString();
            return resultInt;
        }

        /// <summary>
        /// 带参数的插入操作,并能得到参数返回值,此参数从BLL层传来
        ///同上...
        /// </summary>
        /// <returns></returns>
        public int Insert_Paras(DbParameter[] paras)
        {
            return Execute.SExecuteNonQuery("sp_name", paras);
            //这样可以在BLL层通过 paras[1]来获取返回参数了
        }

        /// <summary>
        /// 执行同连接多操作的事务处理
        /// 这里使用1个带参数的存储过程和一个不带参数的sql语句操作
        /// 使用是静态调用方法
        /// </summary>
        /// <returns></returns>
        public bool Insert_Transaction()
        {
            bool resultBool = false;
            DbParameter[] paras = 
            {
                new MySqlParameter("p1","p1value")
                ,new SqlParameter("p2","p2value")
            };
            DbConnection connection = null;
            DbTransaction transaction = null;
            try
            {
                connection = Factory.CreateConnection();
                connection.Open();
                transaction = connection.BeginTransaction();
                int resultInt1 = Execute.SExecuteNonQuery(connection, transaction, "sp_name1", paras);
                int resultInt2 = Execute.SExecuteNonQuery(connection, transaction, "insert into tablename (...) values (...)", null);
                if (resultInt1 > 0 && resultInt2 > 0)
                {
                    transaction.Commit();
                    resultBool = true;
                }
                else
                {
                    transaction.Rollback();
                }
            }
            catch (Exception)
            {
                if (transaction != null)
                {
                    transaction.Rollback();
                }
            }
            finally
            {
                if (transaction != null)
                {
                    transaction.Dispose();
                }
                if (connection != null)
                {
                    //这里需要手动关闭连接!!
                    connection.Close();
                    connection.Dispose();
                }
            }
            return resultBool;
        }

        /// <summary>
        /// 执行同连接多任务操作(不使用事务)
        /// 这里我们使用对象方法。这样执行多任务操作可能会稳定点和效率高点
        /// </summary>
        /// <returns></returns>
        public void Insert_much()
        {
            Execute exec = Execute.NewExecute;
            DbConnection connection = null;
            try
            {
                connection = Factory.CreateConnection();
                exec.ExecuteNonQuery(connection, null, "sp_name", null);
                exec.ExecuteNonQuery(connection, null, "sp_name2", null);
            }
            finally
            {
                if (connection != null)
                {
                    //因为调用了 带事务的那个方法(但是我们设置事务为NULL,事务无效)
                    //所以连接不会自动关闭释放,我们需要手动释放
                    connection.Close();
                    connection.Dispose();
                }
            }
        }

    }

 

 Dam: Dam.rar  

 有兴趣的可以看看:) 内部有帮助文档。

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载