数据库访问底层(DAL)的设计~~贴者有分,嘿嘿
偶自己先帖一个:
大虾表笑话俺^_^
using System;
using System.Data;
using System.Collections;
using System.Data.SqlClient;
namespace com.DataAccess
{
public enum DBType
{
SQL,Access,Oracle
}
public interface IDataAccess
{
IDbConnection Connection { get;}
void Open();
void Close();
void BeginTrans();
void CommitTrans();
void RollBackTrans();
int ExecNonQuery(string cmdText, CommandType cmdType, Hashtable ht);
IDataReader ExecReader(string cmdText, CommandType cmdType, Hashtable ht, bool closeConnection);
DataTable ExecDataTable(string cmdText, CommandType cmdType, Hashtable ht);
DataSet ExecDataSet(string cmdText, CommandType cmdType, Hashtable ht);
object ExecScalar(string cmdText, CommandType cmdType, Hashtable ht);
}
public class SQLAccess : IDataAccess
{
private SqlConnection myCon;
private SqlTransaction myTrans;
private bool inTrans = false;
public SQLAccess(string strConn)
{
myCon = new SqlConnection(strConn);
}
public IDbConnection Connection
{
get { return myCon; }
}
public void Open()
{
if (myCon.State != ConnectionState.Open)
myCon.Open();
}
public void Close()
{
if (myCon.State == ConnectionState.Open)
myCon.Close();
}
public void BeginTrans()
{
myTrans = myCon.BeginTransaction();
inTrans = true;
}
public void CommitTrans()
{
myTrans.Commit();
inTrans = false;
}
public void RollBackTrans()
{
myTrans.Rollback();
inTrans = false;
}
public object ExecScalar(string cmdText, CommandType cmdType, Hashtable ht)
{
SqlCommand myCmd = new SqlCommand();
AppendCommand(myCmd, cmdText, cmdType, ht);
try
{
return myCmd.ExecuteScalar();
}
catch
{
return null;
}
}
public IDataReader ExecReader(string cmdText, CommandType cmdType, Hashtable ht, bool closeConnection)
{
SqlCommand myCmd = new SqlCommand();
AppendCommand(myCmd, cmdText, cmdType, ht);
try
{
if(closeConnection)
return myCmd.ExecuteReader(CommandBehavior.CloseConnection);
else
return myCmd.ExecuteReader();
}
catch
{
return null;
}
}
public DataTable ExecDataTable(string cmdText, CommandType cmdType, Hashtable ht)
{
SqlCommand myCmd = new SqlCommand();
AppendCommand(myCmd, cmdText, cmdType, ht);
SqlDataAdapter myDa = new SqlDataAdapter(myCmd);
DataTable myDt = null;
try
{
myDt = new DataTable();
myDa.Fill(myDt);
}
catch{}
return myDt;
}
public int ExecNonQuery(string cmdText, CommandType cmdType, Hashtable ht)
{
SqlCommand myCmd = new SqlCommand();
AppendCommand(myCmd, cmdText, cmdType, ht);
if (inTrans)
myCmd.Transaction = myTrans;
int i = 0;
try
{
i = myCmd.ExecuteNonQuery();
}
catch
{
i = -1;
}
return i;
}
public DataSet ExecDataSet(string cmdText, CommandType cmdType, Hashtable ht)
{
SqlCommand myCmd = new SqlCommand();
AppendCommand(myCmd, cmdText, cmdType, ht);
SqlDataAdapter myDa = new SqlDataAdapter(myCmd);
DataSet myDs = null;
try
{
myDs = new DataSet();
myDa.Fill(myDs);
}
catch { }
return myDs;
}
public void AppendCommand(SqlCommand myCmd, string cmdText, CommandType cmdType, Hashtable ht)
{
myCmd.Connection = myCon;
myCmd.CommandText = cmdText;
myCmd.CommandType = cmdType;
if (ht != null)
{
IDictionaryEnumerator it = ht.GetEnumerator();
while (it.MoveNext())
{
SqlParameter paras = new SqlParameter(it.Key.ToString(), it.Value);
myCmd.Parameters.Add(paras);
}
}
}
}
/*================================
* 此部分功能暂未实现
*===============================*/
//public class OleAccess : IDataAccess
//{
//}
public class DbFactory
{
//防止类实例化
private DbFactory() { }
//此处实现接口继承多态
public static IDataAccess CreateInstance(string strConn)
{
return new SQLAccess(strConn);
}
}
}