服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

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

2019-09-11 10:49asp.net开发网 ASP.NET教程

这是一个可以实现简单跨数据库基于ADO.NET的组件。您可以在DAL层透过它来访问数据库。这是一个以前写过一个小组件的修改版.

它的特点: 

在您保证SQL语句兼容的前提下,透过它来访问数据库时,在不需要改变DAL层一点代码的前提下,只要修改一下配置文件,它便可以为你跨不同类型的数据库。 
让你的DAL层代码更见简练。它会根据配置文件配置的连接信息,自动为你创建数据库连接,执行操作。关闭连接,释放连接等. 
让DAL层的不同模块访问不同类型或不同数据库更加方便。 
不错的执行效率,它基于原生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 
有兴趣的可以看看:) 内部有帮助文档。

延伸 · 阅读

精彩推荐