简介:
从Microsoft Enterprise Library 5.0 Data Blocks剥离出的数据库操作方法,重新用C++/clr语言封装的一个模块!
只实现几个简单常用的接口,用于c++/clr项目中。
写在代码前面:
项目是c++/clr的,所以他只需要c++/clr的代码,他不需要我提供dll方式的功能模块,他只需要.h和.cpp文件;
不想说了,其他事情还是放在心里吧,直接贴代码就好了!
项目结构:
实现的接口:
代码片段:
public ref class DataBase
{
public:
DataBase(String ^connectionString,DbProviderFactory ^dbProviderFactory)
{
if(String::IsNullOrEmpty(connectionString))
throw gcnew ArgumentException("连接字符串不允许为空");
if (dbProviderFactory == nullptr)
throw gcnew ArgumentNullException("数据库提供类型不允许为空");
this->m_connectionString=connectionString;
this->m_dbProviderFactory=dbProviderFactory;
}
//连接字符串
property String ^ConnectionString
{
String ^get(){return m_connectionString;}
}
virtual int ExecuteNonQuery(DbCommand ^command);
virtual int ExecuteNonQuery(CommandType commandType,String ^commandText);
virtual Object ^ExecuteScalar(DbCommand ^command);
virtual Object ^ExecuteScalar(CommandType commandType,String ^commandText);
virtual DataSet ^ExecuteDataSet(DbCommand ^command);
virtual DataSet ^ExecuteDataSet(CommandType commandType,String ^commandText);
virtual IDataReader ^ExecuteReader(DbCommand ^command);
virtual IDataReader ^ExecuteReader(CommandType commandType,String ^commandText);
enum class UpdateBehavior
{
/// <summary>
/// No interference with the DataAdapter's Update command. If Update encounters
/// an error, the update stops. Additional rows in the Datatable are uneffected.
/// </summary>
Standard,
/// <summary>
/// If the DataAdapter's Update command encounters an error, the update will
/// continue. The Update command will try to update the remaining rows.
/// </summary>
Continue,
/// <summary>
/// If the DataAdapter encounters an error, all updated rows will be rolled back.
/// </summary>
Transactional
};
private:
String ^m_connectionString;
DbProviderFactory ^m_dbProviderFactory;
DbConnection ^GetNewOpenConnection();
DbCommand ^CreateCommandByCommandType(CommandType commandType,String ^commandText);
protected:
virtual DatabaseConnectionWrapper ^GetWrappedConnection();
static void PrepareCommand(DbCommand ^command,DbConnection ^connection);
int DoExecuteNonQuery(DbCommand ^command);
Object ^DoExecuteScalar(IDbCommand ^command);
IDataReader ^DoExecuteReader(DbCommand ^command,CommandBehavior cmdBehavior);
void DoLoadDataSet(DbCommand ^command,DataSet ^dataSet,array<String^> ^tableNames);
DbDataAdapter ^GetDataAdapter(UpdateBehavior updateBehavior);
virtual void SetUpRowUpdatedEvent(DbDataAdapter ^adapter) { }
};
{
public:
DataBase(String ^connectionString,DbProviderFactory ^dbProviderFactory)
{
if(String::IsNullOrEmpty(connectionString))
throw gcnew ArgumentException("连接字符串不允许为空");
if (dbProviderFactory == nullptr)
throw gcnew ArgumentNullException("数据库提供类型不允许为空");
this->m_connectionString=connectionString;
this->m_dbProviderFactory=dbProviderFactory;
}
//连接字符串
property String ^ConnectionString
{
String ^get(){return m_connectionString;}
}
virtual int ExecuteNonQuery(DbCommand ^command);
virtual int ExecuteNonQuery(CommandType commandType,String ^commandText);
virtual Object ^ExecuteScalar(DbCommand ^command);
virtual Object ^ExecuteScalar(CommandType commandType,String ^commandText);
virtual DataSet ^ExecuteDataSet(DbCommand ^command);
virtual DataSet ^ExecuteDataSet(CommandType commandType,String ^commandText);
virtual IDataReader ^ExecuteReader(DbCommand ^command);
virtual IDataReader ^ExecuteReader(CommandType commandType,String ^commandText);
enum class UpdateBehavior
{
/// <summary>
/// No interference with the DataAdapter's Update command. If Update encounters
/// an error, the update stops. Additional rows in the Datatable are uneffected.
/// </summary>
Standard,
/// <summary>
/// If the DataAdapter's Update command encounters an error, the update will
/// continue. The Update command will try to update the remaining rows.
/// </summary>
Continue,
/// <summary>
/// If the DataAdapter encounters an error, all updated rows will be rolled back.
/// </summary>
Transactional
};
private:
String ^m_connectionString;
DbProviderFactory ^m_dbProviderFactory;
DbConnection ^GetNewOpenConnection();
DbCommand ^CreateCommandByCommandType(CommandType commandType,String ^commandText);
protected:
virtual DatabaseConnectionWrapper ^GetWrappedConnection();
static void PrepareCommand(DbCommand ^command,DbConnection ^connection);
int DoExecuteNonQuery(DbCommand ^command);
Object ^DoExecuteScalar(IDbCommand ^command);
IDataReader ^DoExecuteReader(DbCommand ^command,CommandBehavior cmdBehavior);
void DoLoadDataSet(DbCommand ^command,DataSet ^dataSet,array<String^> ^tableNames);
DbDataAdapter ^GetDataAdapter(UpdateBehavior updateBehavior);
virtual void SetUpRowUpdatedEvent(DbDataAdapter ^adapter) { }
};