天气渐冷,闲来无事就把业余时间自己使用的数据访问库凉一凉.这个库本人自己使用了2年多,主要用于个人学习时需要操作数据库时使用,非组织和商业性质的使用.记得上学的时候,在网络上看到SqlServerHelper操作ADO.NET甚方便,一下子就着了迷不管学习还是工作都会带上这个Class,甚至我的U盘里面也会存上这个Class,哈哈.随着工作经验和沿街的开阔,我渐渐的有了自己的ADO.NET操作习惯以及封装使用方式.因此就写了Basic.Data.dll,言归正传.

1.Database:主要用于存储数据连接字符串,配置节名称,ADO.NET数据基础工厂,Database由IDatabaseProvide接口提供.

2.DatabaseConnection:用于数据库连接,和数据库连接状态等提供者,主要由IDatabaseConnectionProvide接口提供.

3.DatabaseCommandText,DatabaseCommandProcedure:用于执行Command和Procedure操作.分别由IDatabaseCommandTextAsyncProvide,IDatabaseCommandProcedure接口提供.

4.DatabaseCommandTextAsync,DatabaseCommandProcedureAsync:用于异步执行Command和Procedure操作.分别由IDatabaseCommandTextAsyncProvide和IDatabaseCommandProcedureAsyncProvide接口提供.

5.DatabaseOperation:是过程执行SQL操作的封装.这个会提供代码演示.

6.OperationValue:所有Command操作返回的结果,存储在该类的Value属性上.

*******************************************************************************************************************************

Database:

 public class Database : IDatabaseProvide
{
/// <summary>
/// 内置默认识别Config Key:DatabaseProvide和DatabaseProvideConnectionString
/// </summary>
public Database()
{
this.DatabaseProvideName = ConfigurationManager.AppSettings["DatabaseProvide"];
this.ConnectionString = ConfigurationManager.AppSettings["DatabaseProvideConnectionString"];
this.Initialization();
} public Database(string argument_ProvideName)
{
this.DatabaseProvideName = argument_ProvideName;
this.ConnectionString = ConfigurationManager.AppSettings["DatabaseProvideConnectionString"];
this.Initialization();
} public Database(string argument_ProvideName, string argument_ConnectionString)
{
this.DatabaseProvideName = argument_ProvideName;
this.ConnectionString = argument_ConnectionString;
this.Initialization();
} public string DatabaseProvideName { get; set; }
internal string ConnectionString { get; set; }
internal DbProviderFactory Factory { get; set; } public void Initialization()
{
this.Factory = DbProviderFactories.GetFactory(this.DatabaseProvideName);
}
}

数据连接配置只需要在Config配置文件上配置如下:

<appSettings>
    <add key="DatabaseProvide" value="System.Data.SqlClient"/>
    <add key="DatabaseProvideConnectionString" value="Data Source=.;Initial Catalog=TestDB;User ID=sa;Password=;"/>
    <!--<add key="DatabaseProvide_ODBC" value="System.Data.Odbc"/>-->
    <!--<add key="DatabaseProvideConnectionString" value="DRIVER={SQL SERVER};SERVER=127.0.0.1;DATABASE=TestDB;UID=sa;PWD=;"/>-->
  </appSettings>

Database分别提供了三个构造方式,第一种是默认走配置创建(key:DatabaseProvide,DatabaseProvideConnectionString必须).第二种提供ProvideName配置名称,这个构造主要一般可能使用的ODBC驱动等连接方式,但DatabaseProvideConnectionString必须指定.第三种构造主要自己实现的Provide和连接.这个我没有提供相应的扩展,需要自己去敲定.这样Database引擎就创建出来.提供的接口也很简单:

 public interface IDatabaseProvide
{
void Initialization();
}

DatabaseConnection:

     public sealed class DatabaseConnection : IDatabaseConnectionProvide
{
public DatabaseConnection(Database argument_Provide)
{
this.Initialization(argument_Provide);
} internal DbConnection Connection { get; private set; }
internal Database DatabaseProvide
{
get; set;
} public ConnectionState DatabaseConnectionState
{
get
{
return this.Connection.State;
}
} private void Initialization(Database argument_DatabaseProvide)
{
if (null == this.Connection)
{
this.DatabaseProvide = argument_DatabaseProvide;
this.Connection = this.DatabaseProvide.Factory.CreateConnection();
this.Connection.ConnectionString = this.DatabaseProvide.ConnectionString;
} this.Initialization();
} public void Initialization() //初始化默认执行过一次
{
this.Open();
} public void Open()
{
if (ConnectionState.Closed == this.Connection.State)
{
this.Connection.Open();
}
} public void Change(string argument_DatabaseName)
{
if (null != this.DatabaseProvide && null != this.Connection)
{
this.Connection.ChangeDatabase(argument_DatabaseName);
this.DatabaseProvide.ConnectionString = this.Connection.ConnectionString;
}
}
}

它只有一个构造,必须提供Database,因为Connection需要Database来提供创建.提供了如下操作:

 public interface IDatabaseConnectionProvide
{
void Initialization();
void Change(string argument_DatabaseName);
void Open();
}

DatabaseCommandText 和 DatabaseCommandProcedure:

 public sealed class DatabaseCommandText : IDatabaseCommandTextProvide
{
public DatabaseCommandText(DatabaseConnection argument_Connection)
{
this.Connection = argument_Connection;
} public DatabaseConnection Connection { get; private set; }
public string CommandName { get; set; } public DbParameter NewParameter()
{
return this.Connection.DatabaseProvide.Factory.CreateParameter();
} public DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction)
{
DbParameter _Parameter = this.Connection.DatabaseProvide.Factory.CreateParameter();
_Parameter.ParameterName = argument_ParameterName;
_Parameter.Value = argument_Value;
_Parameter.DbType = argument_DbType;
_Parameter.Direction = Direction;
return _Parameter;
} public OperationValue TransactionDelete(string argument_SqlText, DbParameter[] argument_Parameters)
{
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
DbTransaction _Transaction = this.Connection.Connection.BeginTransaction();
_Command.Connection = this.Connection.Connection;
_Command.Transaction = _Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
this.Connection.Open();
_CommandResult = _Command.ExecuteNonQuery();
_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public OperationValue Delete(string argument_SqlText, DbParameter[] argument_Parameters)
{
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
this.Connection.Open();
_CommandResult = _Command.ExecuteNonQuery();
}
catch (Exception)
{
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public OperationValue Delete(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
DbTransaction _Transaction = argument_Transaction;
_Command.Connection = this.Connection.Connection;
_Command.Transaction = _Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = _Command.ExecuteNonQuery();
//_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public DataTableReader Reader(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
DataTable _QueryTable = new DataTable();
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} DbDataReader _Reader = _Command.ExecuteReader();
_QueryTable.Load(_Reader);
return _QueryTable.CreateDataReader();
} public OperationValue Query(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
DataTable _QueryTable = new DataTable();
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} DbDataReader _Reader = _Command.ExecuteReader();
_QueryTable.Load(_Reader);
_Reader.Close();
OperationValue _Value = new OperationValue();
_Value.Value = _QueryTable;
return _Value;
} public OperationValue Query(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters)
{
this.Connection.Open();
DataTable _QueryTable = new DataTable();
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.Transaction = argument_Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} DbDataReader _Reader = _Command.ExecuteReader();
_QueryTable.Load(_Reader);
_Reader.Close();
OperationValue _Value = new OperationValue();
_Value.Value = _QueryTable;
return _Value;
} public OperationValue TransactionSave(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
DbTransaction _Transaction = this.Connection.Connection.BeginTransaction();
_Command.Transaction = _Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = _Command.ExecuteNonQuery();
_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult;
return _Value;
} public OperationValue Save(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = _Command.ExecuteNonQuery();
}
catch (Exception)
{
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult;
return _Value;
} public OperationValue Save(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
DbTransaction _Transaction = argument_Transaction;
_Command.Transaction = _Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = _Command.ExecuteNonQuery();
//_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult;
return _Value;
} public OperationValue TransactionModify(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
DbTransaction _Transaction = this.Connection.Connection.BeginTransaction();
_Command.Transaction = _Transaction;
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = _Command.ExecuteNonQuery();
_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public OperationValue Modify(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = _Command.ExecuteNonQuery();
}
catch (Exception)
{
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public OperationValue Modify(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
DbTransaction _Transaction = argument_Transaction;
_Command.Transaction = _Transaction;
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = _Command.ExecuteNonQuery();
//_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
}
}
 public sealed class DatabaseCommandProcedure : IDatabaseCommandProcedure
{
public DatabaseCommandProcedure(DatabaseConnection argument_Connection)
{
this.Connection = argument_Connection;
} public DatabaseConnection Connection { get; private set; }
public string CommandName { get; set; } public DbParameter NewParameter()
{
return this.Connection.DatabaseProvide.Factory.CreateParameter();
} public DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction)
{
DbParameter _Parameter = this.Connection.DatabaseProvide.Factory.CreateParameter();
_Parameter.ParameterName = argument_ParameterName;
_Parameter.Value = argument_Value;
_Parameter.DbType = argument_DbType;
_Parameter.Direction = Direction;
return _Parameter;
} public OperationValue Query(string argument_ProcedureName, DbParameter[] argument_Parameters)
{
this.Connection.Open();
DataTable _QueryTable = new DataTable();
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_ProcedureName;
_Command.CommandType = CommandType.StoredProcedure;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} DbDataReader _Reader = _Command.ExecuteReader();
_QueryTable.Load(_Reader);
_Reader.Close();
OperationValue _Value = new OperationValue();
_Value.Value = _QueryTable;
return _Value;
} public OperationValue ExecuteNonQuery(string argument_ProcedureName, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_ProcedureName;
_Command.CommandType = CommandType.StoredProcedure;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} _CommandResult = _Command.ExecuteNonQuery();
OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult;
return _Value;
}
}

以上提供的接口操作:

 public interface IDatabaseCommandTextProvide
{
string CommandName { get; set; }
DatabaseConnection Connection { get; }
DbParameter NewParameter();
DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction);
OperationValue Query(string argument_SqlText, DbParameter[] argument_Parameters);
OperationValue Query(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
DataTableReader Reader(string argument_SqlText, DbParameter[] argument_Parameters);
OperationValue TransactionSave(string argument_SqlText, DbParameter[] argument_Parameters);
OperationValue Save(string argument_SqlText, DbParameter[] argument_Parameters);
OperationValue Save(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
OperationValue TransactionModify(string argument_SqlText , DbParameter[] argument_Parameters);
OperationValue Modify(string argument_SqlText, DbParameter[] argument_Parameters);
OperationValue Modify(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
OperationValue TransactionDelete(string argument_SqlText, DbParameter[] argument_Parameters);
OperationValue Delete(string argument_SqlText, DbParameter[] argument_Parameters);
OperationValue Delete(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
}
 public interface IDatabaseCommandProcedure
{
string CommandName { get; set; }
DatabaseConnection Connection { get; }
OperationValue Query(string argument_ProcedureName, DbParameter[] argument_Parameters);
OperationValue ExecuteNonQuery(string argument_ProcedureName, DbParameter[] argument_Parameters);
DbParameter NewParameter();
DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction);
}

通过IDatabaseCommandTextProvide接口可以看出有Transaction开头命名的方法,很显然它实现了事物操作.有人可能对CommandName不是很了解.它用于记录命令操作结果的名称,最能体现的是使用IOperation接口实现的DatabaseOperation操作.后期会提供案例.关于存储过程在Code上加上事物这里没有做,主要是考虑既然编写了存储过程脚本,那么你的事物应该在存储过程上处理,而不是在Code上.

DatabaseCommandTextAsync 和 DatabaseCommandProcedureAsync:

 public sealed class DatabaseCommandTextAsync : IDatabaseCommandTextAsyncProvide
{
public DatabaseCommandTextAsync(DatabaseConnection argument_Connection)
{
this.Connection = argument_Connection;
} public string CommandName
{
get;
set;
} public DatabaseConnection Connection
{
get;
private set;
} public DbParameter NewParameter()
{
return this.Connection.DatabaseProvide.Factory.CreateParameter();
} public DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction)
{
DbParameter _Parameter = this.Connection.DatabaseProvide.Factory.CreateParameter();
_Parameter.ParameterName = argument_ParameterName;
_Parameter.Value = argument_Value;
_Parameter.DbType = argument_DbType;
_Parameter.Direction = Direction;
return _Parameter;
} public async Task<OperationValue> DeleteAsync(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = await _Command.ExecuteNonQueryAsync();
}
catch (Exception)
{
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public async Task<OperationValue> DeleteAsync(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
DbTransaction _Transaction = argument_Transaction;
_Command.Connection = this.Connection.Connection;
_Command.Transaction = _Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = await _Command.ExecuteNonQueryAsync();
//_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public async Task<OperationValue> ModifyAsync(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = await _Command.ExecuteNonQueryAsync();
}
catch (Exception)
{
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public async Task<OperationValue> ModifyAsync(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
DbTransaction _Transaction = argument_Transaction;
_Command.Transaction = _Transaction;
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = await _Command.ExecuteNonQueryAsync();
//_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public async Task<OperationValue> QueryAsync(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
DataTable _QueryTable = new DataTable();
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
DbDataReader _Reader = null;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_Reader = await _Command.ExecuteReaderAsync();
_QueryTable.Load(_Reader);
}
catch (Exception)
{ }
finally
{
_Reader.Close();
} OperationValue _Value = new OperationValue();
_Value.Value = _QueryTable;
return _Value;
} public async Task<OperationValue> QueryAsync(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters)
{
this.Connection.Open();
DataTable _QueryTable = new DataTable();
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.Transaction = argument_Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
DbDataReader _Reader = null;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_Reader = await _Command.ExecuteReaderAsync();
_QueryTable.Load(_Reader);
}
catch (Exception)
{ }
finally
{
_Reader.Close();
} OperationValue _Value = new OperationValue();
_Value.Value = _QueryTable;
return _Value;
} public async Task<OperationValue> SaveAsync(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = await _Command.ExecuteNonQueryAsync();
}
catch (Exception)
{
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult;
return _Value;
} public async Task<OperationValue> SaveAsync(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
DbTransaction _Transaction = argument_Transaction;
_Command.Transaction = _Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = await _Command.ExecuteNonQueryAsync();
//_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult;
return _Value;
} public async Task<OperationValue> TransactionDeleteAsync(string argument_SqlText, DbParameter[] argument_Parameters)
{
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
DbTransaction _Transaction = this.Connection.Connection.BeginTransaction();
_Command.Connection = this.Connection.Connection;
_Command.Transaction = _Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
this.Connection.Open();
_CommandResult = await _Command.ExecuteNonQueryAsync();
_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public async Task<OperationValue> TransactionModifyAsync(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
DbTransaction _Transaction = this.Connection.Connection.BeginTransaction();
_Command.Transaction = _Transaction;
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = await _Command.ExecuteNonQueryAsync();
_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult; return _Value;
} public async Task<OperationValue> TransactionSaveAsync(string argument_SqlText, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
DbTransaction _Transaction = this.Connection.Connection.BeginTransaction();
_Command.Transaction = _Transaction;
_Command.CommandText = argument_SqlText;
_Command.CommandType = CommandType.Text;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = await _Command.ExecuteNonQueryAsync();
_Transaction.Commit();
}
catch (Exception)
{
_Transaction.Rollback();
} OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult;
return _Value;
}
}
 public sealed class DatabaseCommandProcedureAsync : IDatabaseCommandProcedureAsyncProvide
{
public DatabaseCommandProcedureAsync(DatabaseConnection argument_Connection)
{
this.Connection = argument_Connection;
} public string CommandName { get; set; } public DatabaseConnection Connection { get; private set; } public async Task<OperationValue> ExecuteNonQuery(string argument_ProcedureName, DbParameter[] argument_Parameters)
{
this.Connection.Open();
int _CommandResult = ;
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_ProcedureName;
_Command.CommandType = CommandType.StoredProcedure;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_CommandResult = await _Command.ExecuteNonQueryAsync();
}
catch (Exception)
{ } OperationValue _Value = new OperationValue();
_Value.Value = _CommandResult;
return _Value;
} public DbParameter NewParameter()
{
return this.Connection.DatabaseProvide.Factory.CreateParameter();
} public DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction)
{
DbParameter _Parameter = this.Connection.DatabaseProvide.Factory.CreateParameter();
_Parameter.ParameterName = argument_ParameterName;
_Parameter.Value = argument_Value;
_Parameter.DbType = argument_DbType;
_Parameter.Direction = Direction;
return _Parameter;
} public async Task<OperationValue> Query(string argument_ProcedureName, DbParameter[] argument_Parameters)
{
this.Connection.Open();
DataTable _QueryTable = new DataTable();
DbCommand _Command = this.Connection.DatabaseProvide.Factory.CreateCommand();
_Command.Connection = this.Connection.Connection;
_Command.CommandText = argument_ProcedureName;
_Command.CommandType = CommandType.StoredProcedure;
DbDataReader _Reader = null;
if (null != argument_Parameters)
{
_Command.Parameters.AddRange(argument_Parameters);
} try
{
_Reader = await _Command.ExecuteReaderAsync();
_QueryTable.Load(_Reader);
}
catch (Exception)
{ }
finally
{
_Reader.Close();
} OperationValue _Value = new OperationValue();
_Value.Value = _QueryTable;
return _Value;
}
}

以上提供的接口操作:

 public interface IDatabaseCommandTextAsyncProvide
{
string CommandName { get; set; }
DatabaseConnection Connection { get; }
DbParameter NewParameter();
DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction);
Task<OperationValue> QueryAsync(string argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> QueryAsync(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
Task<OperationValue> TransactionSaveAsync(string argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> SaveAsync(string argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> SaveAsync(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
Task<OperationValue> TransactionModifyAsync(string argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> ModifyAsync(string argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> ModifyAsync(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
Task<OperationValue> TransactionDeleteAsync(string argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> DeleteAsync(string argument_SqlText, DbParameter[] argument_Parameters);
Task<OperationValue> DeleteAsync(string argument_SqlText, DbTransaction argument_Transaction, DbParameter[] argument_Parameters);
}
 public interface IDatabaseCommandProcedureAsyncProvide
{
string CommandName { get; set; }
DatabaseConnection Connection { get; }
Task<OperationValue> Query(string argument_ProcedureName, DbParameter[] argument_Parameters);
Task<OperationValue> ExecuteNonQuery(string argument_ProcedureName, DbParameter[] argument_Parameters);
DbParameter NewParameter();
DbParameter NewParameter(string argument_ParameterName, object argument_Value, DbType argument_DbType, ParameterDirection Direction);
}

很简单,异步的操作也是如此.

OperationValue:

前面介绍过,所有的操作结果都存储在OperationValue.Value上.Value这个属性是object类型. 操作的时候,可能出现大量的装箱和拆箱的操作,这个可以自己去细化按需实现,我只是用它来学习他用,并没有考虑到性能之类的考量.

DatabaseOperation:

 public interface IOperation
{
DatabaseOperation BeginTransaction();
DatabaseOperation EndTransaction();
DatabaseOperation CancelTransaction();
DatabaseOperation ExecuteTextCommand(Func<IDatabaseCommandTextProvide, OperationValue> argument_Command);
DatabaseOperation ExecuteTextCommand(Func<IDatabaseCommandTextProvide, DbTransaction, OperationValue> argument_Command);
DatabaseOperation ExecuteProcedureCommand(Func<IDatabaseCommandProcedure, OperationValue> argument_Command);
DatabaseOperation WidthExecuteTextCommand(Func<IDatabaseCommandTextProvide, OperationValue> argument_Command);
DatabaseOperation WidthExecuteTextCommand(Func<IDatabaseCommandTextProvide, DbTransaction, OperationValue> argument_Command);
DatabaseOperation WidthExecuteProcedureCommand(Func<IDatabaseCommandProcedure, OperationValue> argument_Command);
}
 public sealed class DatabaseOperation : IOperation
{
public DatabaseOperation()
{
this._Provide = new Database();
this.Initialization();
} public DatabaseOperation(string argument_ProvideName)
{
this._Provide = new Database(argument_ProvideName);
this.Initialization();
} public DatabaseOperation(string argument_ProvideName,string argument_ConnectionString)
{
this._Provide = new Database(argument_ProvideName, argument_ConnectionString);
this.Initialization();
} public DatabaseOperation(Database argument_Provide)
{
this._Provide = argument_Provide;
this.Initialization();
} private DatabaseConnection _ConnectionProvide = null;
private DatabaseCommandText _NextTextCommand = null;
private DatabaseCommandProcedure _NextProcedureProvide = null;
private Database _Provide = null;
private DbTransaction _Transaction = null; public Dictionary<string, OperationValue> CommandValues { get; private set; } private void Initialization()
{
this.CommandValues = new Dictionary<string, OperationValue>();
this._ConnectionProvide = new DatabaseConnection(this._Provide);
} public DatabaseOperation ExecuteTextCommand(Func<IDatabaseCommandTextProvide, OperationValue> argument_Command)
{
_NextTextCommand = new DatabaseCommandText(this._ConnectionProvide);
OperationValue _Value = argument_Command.Invoke(_NextTextCommand);
this.CommandValues.Clear();
this.CommandValues.Add(_NextTextCommand.CommandName, _Value);
return this;
} public DatabaseOperation ExecuteTextCommand(Func<IDatabaseCommandTextProvide, DbTransaction, OperationValue> argument_Command)
{
if (null == this._Transaction)
{
throw new NullReferenceException("没有检测到事务的开始");
} _NextTextCommand = new DatabaseCommandText(this._ConnectionProvide);
OperationValue _Value = argument_Command.Invoke(_NextTextCommand, this._Transaction);
this.CommandValues.Clear();
this.CommandValues.Add(_NextTextCommand.CommandName, _Value);
return this;
} public DatabaseOperation WidthExecuteTextCommand(Func<IDatabaseCommandTextProvide, OperationValue> argument_Command)
{
_NextTextCommand = new DatabaseCommandText(this._ConnectionProvide);
OperationValue _Value = argument_Command.Invoke(_NextTextCommand);
CommandValues.Add(_NextTextCommand.CommandName, _Value);
return this;
} public DatabaseOperation WidthExecuteTextCommand(Func<IDatabaseCommandTextProvide, DbTransaction, OperationValue> argument_Command)
{
if (null == this._Transaction)
{
throw new NullReferenceException("没有检测到事务的开始");
} this._NextTextCommand = new DatabaseCommandText(this._ConnectionProvide);
OperationValue _Value = argument_Command.Invoke(this._NextTextCommand, this._Transaction);
CommandValues.Add(_NextTextCommand.CommandName, _Value);
return this;
} public DatabaseOperation ExecuteProcedureCommand(Func<IDatabaseCommandProcedure, OperationValue> argument_Command)
{
_NextProcedureProvide = new DatabaseCommandProcedure(this._ConnectionProvide);
OperationValue _Value = argument_Command.Invoke(_NextProcedureProvide);
this.CommandValues.Clear();
this.CommandValues.Add(_NextProcedureProvide.CommandName, _Value);
return this;
} public DatabaseOperation WidthExecuteProcedureCommand(Func<IDatabaseCommandProcedure, OperationValue> argument_Command)
{
_NextProcedureProvide = new DatabaseCommandProcedure(this._ConnectionProvide);
OperationValue _Value = argument_Command.Invoke(_NextProcedureProvide);
CommandValues.Add(_NextProcedureProvide.CommandName, _Value);
return this;
} public DatabaseOperation BeginTransaction()
{
this._Transaction = this._ConnectionProvide.Connection.BeginTransaction();
return this;
} public DatabaseOperation EndTransaction()
{
this._Transaction.Commit();
return this;
} public DatabaseOperation CancelTransaction()
{
this._Transaction.Rollback();
return this;
}
}

这个主要用于执行过程SQL.设计此类的灵感来源于一次工作任务,当时要整理和搬迁Oracle,SQL SERVER , DB2等服务器上的数据,存储过程和函数等很多操作搬迁特别麻烦.因此设计了一个过程式执行SQL.

*************************************************************************************************************************************************

案例1 (备注:这个用的是System.Data.ODBC):

 Database _Provide = new Database();
DatabaseConnection _Connection = new DatabaseConnection(_Provide);
IDatabaseCommandProcedure _CommandProcedure = new DatabaseCommandProcedure(_Connection);
DbParameter _IDParameter = _CommandProcedure.NewParameter("ID", , DbType.Int32, ParameterDirection.Input);
OperationValue _Value = _CommandProcedure.Query("Query ?", new DbParameter[] { _IDParameter });

案例2:

 DatabaseOperation _database_operation = new DatabaseOperation();
_database_operation = _database_operation.ExecuteTextCommand(command =>
{
command.CommandName = "INSERT";
return command.TransactionSave("INSERT INTO DatabaseUser(Name) VALUES('五哥哥')", null); }).ExecuteProcedureCommand((_command) =>
{
bool _res = Convert.ToBoolean(_database_operation.CommandValues["INSERT"].Value);
if (_res)
{
DbParameter _IDParameter = _command.NewParameter("ID", , DbType.Int32, ParameterDirection.Input);
_command.CommandName = "Query";
return _command.Query("Query", new DbParameter[] { _IDParameter });
}
else
{
return null;
}
}).WidthExecuteTextCommand(_command =>
{
_command.CommandName = "UPDATE";
return _command.Modify("UPDATE DatabaseUser SET Name = '张三丰'", null);
}); DataTable _dt = (DataTable)_database_operation.CommandValues["Query"].Value;
for (int i = ; i < _dt.Rows.Count; i++)
{
Console.WriteLine("ID:{0}\tName:{1}", _dt.Rows[i]["ID"], _dt.Rows[i]["Name"]);
}

案例3:

 DatabaseOperation _database_operation = new DatabaseOperation();
_database_operation.BeginTransaction();
_database_operation.ExecuteTextCommand((command, transaction) =>
{
command.CommandName = "新增";
return command.Save("INSERT INTO DatabaseUser(Name) VALUES('五哥哥')", null);
}).WidthExecuteTextCommand((command, transaction) =>
{
command.CommandName = "查询";
return command.Query("SELECT * FROM DatabaseUser WHERE Name = '五哥哥'", transaction, null);
}); DataTable _Dt = _database_operation.CommandValues["查询"].Value as DataTable;
if ("五哥哥".Equals((_Dt.Rows[]["Name"])))
{
_database_operation.CancelTransaction();
}

案例就提供到这里了...

之前有的人会问我,为甚么不去用EF框架,其实这个萝卜白菜各有所爱。不管ADO.NET还是EF都会让你在工作上开发得到便利就行.以上提供的是精简版本的,用于生产环境的,我就不提供了,支持Redis我也没有提供.这个比较复杂而且麻烦,但主要的思想和框架体系呈现出来了,可能有的人用于工作投入生产,这个精简版本的我没有测试过,有经验的人可以根据这个思想进行扩展。第一次拿出来自己写的东西,哈,原来写博客这么好玩,以后有时间的话,就写一写.  各位晚安...

我与ADO.NET二三事的更多相关文章

  1. 我与ADO.NET二三事(2)

    继上篇开始,这里主要再次精简.因为大家已经熟悉了主要思想以及它的工作方式.那么这里提供的案例改动会很大.上篇的DatabaseCommand***均是为了大家能够轻松的理解所临时编写的.这次提供的接口 ...

  2. Java并发编程二三事

    Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...

  3. linux杂记(十二?) 关于账号和密码的二三事

    关于密码的二三事 关于账号和密码的二三事 久了不更linux的相关知识,实在是懒得想内容点(纯粹是懒).那么今天就来谈谈关于linux密码和账号的重要概念. 假如你的主机遭到入侵,那么对方的第一个侵入 ...

  4. MySQL5.7关于密码二三事

    MySQL5.7关于密码二三事 第一个:update user set password=password('root') where user='root' and host='localhost' ...

  5. Java中的匿名内部类及内部类的二三事

    匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...

  6. Emacs 启动优化二三事

    Emacs 启动优化二三事 */--> div.org-src-container { font-size: 85%; font-family: monospace; } p {font-siz ...

  7. WinForm二三事(三)Control.Invoke&Control.BeginInvoke

    http://www.cnblogs.com/yuyijq/archive/2010/01/11/1643802.html 这个系列从2009年写到2010年,差点又成太监文.随着WPF/Silver ...

  8. iOS7下滑动返回与ScrollView共存二三事

    [转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用 ...

  9. 一只代码小白git托管路上的二三事

    [经验]一只代码小白git托管路上的二三事 写在前面的话 寒假的时候,娄老师给我们布置了代码托管的作业,并要求把托管地址发给学委.因假期的时候没有带电脑回家,所以只是在手机上草草注册了,也稀里糊涂就将 ...

随机推荐

  1. angularjs揭秘

    angularjs揭秘

  2. SQL Server 默认跟踪(Default Trace)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 查看默认跟踪信息(Default Tr ...

  3. 12款非常精致的免费 HTML5 & CSS3 网站模板

    01. Joefrey Mahusay 很炫的单页网站模板,基于 HTML5 & CSS3 制作,适合用于设计师个人简历.摄影师和平面设计师的个人作品展示. 演示  下载 02. Folder ...

  4. JSON和JS对象之间的互转

    1. jQuery插件支持的转换方式 $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2. 浏览器支持的 ...

  5. C# 如何提取SaveFileDialog的保存路径

    直接上代码 public TestOne() { InitializeComponent(); SaveFileDialog();//调用打开SaveFileDialog 保存对话框 } #regio ...

  6. jquery实现的网页选项卡(拾忆)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. T-SQL:毕业生出门需知系列(二)

    第2课 检索数据 2.1 SELECT 语句 用途:从一个或多个表中检索数据信息 关键字:作为SQL组成部分的保留字.关键字不能用作表或列的名字. 为了使用SELECT检索表数据,必须至少给出两条信息 ...

  8. position:fixed和scroll实现div浮动【示例】

    前言 在自己建站的过程中,要实现一个div随滚动条浮动的效果,网上找了些示例不太好用,还是自己动手,丰衣足食,写的不好请大家谅解,毕竟我不是搞前端的,因为自己建站毕竟每一步都必须自己来,这边只是做个记 ...

  9. Mac如何删除MySQL,Mac下MySQL卸载方法

    在Mac下安装完MySQL之后,出现了无法启动的问题,多翻尝试依然不能解决问题,最后只能把它删掉. 如何在Mac下删除MySQL呢,只需要在终端执行如下命令就可以把MySQL在Mac下彻底删除干净了. ...

  10. 史上最详细的iOS之事件的传递和响应机制

    前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...