using System;
using System.Data;
using System.Data.Common;
using System.Configuration;
public class DbHelper
{
private static string dbProviderName = ConfigurationManager.AppSettings["DbHelperProvider"];
private static string dbConnectionString = ConfigurationManager.AppSettings["DbHelperConnectionString"];
private DbConnection connection;
public DbHelper()
{
this.connection = CreateConnection(DbHelper.dbConnectionString);
}
public DbHelper(string connectionString)
this.connection = CreateConnection(connectionString);
public static DbConnection CreateConnection()
DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
DbConnection dbconn = dbfactory.CreateConnection();
dbconn.ConnectionString = DbHelper.dbConnectionString;
return dbconn;
public static DbConnection CreateConnection(string connectionString)
DbConnection dbconn = dbfactory.CreateConnection();
dbconn.ConnectionString = connectionString;
public DbCommand GetStoredProcCommond(string storedProcedure)
DbCommand dbCommand = connection.CreateCommand();
dbCommand.CommandText = storedProcedure;
dbCommand.CommandType = CommandType.StoredProcedure;
return dbCommand;
public DbCommand GetSqlStringCommond(string sqlQuery)
dbCommand.CommandText = sqlQuery;
dbCommand.CommandType = CommandType.Text;
增加參數增加參數#region 增加參數
public void AddParameterCollection(DbCommand cmd, DbParameterCollection dbParameterCollection)
foreach (DbParameter dbParameter in dbParameterCollection)
{
cmd.Parameters.Add(dbParameter);
}
public void AddOutParameter(DbCommand cmd, string parameterName, DbType dbType, int size)
DbParameter dbParameter = cmd.CreateParameter();
dbParameter.DbType = dbType;
dbParameter.ParameterName = parameterName;
dbParameter.Size = size;
dbParameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(dbParameter);
public void AddInParameter(DbCommand cmd, string parameterName, DbType dbType, object value)
dbParameter.Value = value;
dbParameter.Direction = ParameterDirection.Input;
public void AddReturnParameter(DbCommand cmd, string parameterName, DbType dbType)
dbParameter.Direction = ParameterDirection.ReturnValue;
public DbParameter GetParameter(DbCommand cmd, string parameterName)
return cmd.Parameters[parameterName];
#endregion
執行執行#region 執行
public DataSet ExecuteDataSet(DbCommand cmd)
DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
dbDataAdapter.SelectCommand = cmd;
DataSet ds = new DataSet();
dbDataAdapter.Fill(ds);
return ds;
public DataTable ExecuteDataTable(DbCommand cmd)
DataTable dataTable = new DataTable();
dbDataAdapter.Fill(dataTable);
return dataTable;
public DbDataReader ExecuteReader(DbCommand cmd)
cmd.Connection.Open();
DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
public int ExecuteNonQuery(DbCommand cmd)
int ret = cmd.ExecuteNonQuery();
cmd.Connection.Close();
return ret;
public object ExecuteScalar(DbCommand cmd)
object ret = cmd.ExecuteScalar();
#endregion
執行事務執行事務#region 執行事務
public DataSet ExecuteDataSet(DbCommand cmd,Trans t)
cmd.Connection = t.DbConnection;
cmd.Transaction = t.DbTrans;
DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
public DataTable ExecuteDataTable(DbCommand cmd, Trans t)
return dataTable;
public DbDataReader ExecuteReader(DbCommand cmd, Trans t)
cmd.Transaction = t.DbTrans;
DbDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable();
public int ExecuteNonQuery(DbCommand cmd, Trans t)
cmd.Transaction = t.DbTrans;
int ret = cmd.ExecuteNonQuery();
public object ExecuteScalar(DbCommand cmd, Trans t)
object ret = cmd.ExecuteScalar();
}
public class Trans : IDisposable
private DbConnection conn;
private DbTransaction dbTrans;
public DbConnection DbConnection
{
get { return this.conn; }
public DbTransaction DbTrans
get { return this.dbTrans; }
public Trans()
conn = DbHelper.CreateConnection();
conn.Open();
dbTrans = conn.BeginTransaction();
public Trans(string connectionString)
conn = DbHelper.CreateConnection(connectionString);
conn.Open();
public void Commit()
dbTrans.Commit();
this.Colse();
public void RollBack()
dbTrans.Rollback();
public void Dispose()
public void Colse()
if (conn.State == System.Data.ConnectionState.Open)
conn.Close();
那麼如何使用它呢?下面我給出一些基本的使用示例,基本能滿足你大部分的資料庫操作需要了.
1)直接執行sql語句
DbHelper db = new DbHelper();
DbCommand cmd = db.GetSqlStringCommond("insert t1 (id)values(’haha’)");
db.ExecuteNonQuery(cmd);
2)執行存儲過程
DbCommand cmd = db.GetStoredProcCommond("t1_insert");
db.AddInParameter(cmd, "@id", DbType.String, "heihei");
3)傳回DataSet
DbCommand cmd = db.GetSqlStringCommond("select * from t1");
DataSet ds = db.ExecuteDataSet(cmd);
4)傳回DataTable
DbCommand cmd = db.GetSqlStringCommond("t1_findall");
DataTable dt = db.ExecuteDataTable(cmd);
5)輸入參數/輸出參數/傳回值的使用(比較重要哦)
DbCommand cmd = db.GetStoredProcCommond("t2_insert");
db.AddInParameter(cmd, "@timeticks", DbType.Int64, DateTime.Now.Ticks);
db.AddOutParameter(cmd, "@outString", DbType.String, 20);
db.AddReturnParameter(cmd, "@returnValue", DbType.Int32);
string s = db.GetParameter(cmd, "@outString").Value as string;//out parameter
int r = Convert.ToInt32(db.GetParameter(cmd, "@returnValue").Value);//return value
6)DataReader使用
DbHelper db = new DbHelper();
db.AddOutParameter(cmd, "@outString", DbType.String, 20);
using (DbDataReader reader = db.ExecuteReader(cmd))
dt.Load(reader);
}
7)事務的使用.(項目中需要将基本的資料庫操作組合成一個完整的業務流時,代碼級的事務是必不可少的哦)
pubic void DoBusiness()
using (Trans t = new Trans())
try
D1(t);
throw new Exception();//如果有異常,會復原滴
D2(t);
t.Commit();
catch
t.RollBack();
public void D1(Trans t)
if (t == null) db.ExecuteNonQuery(cmd);
else db.ExecuteNonQuery(cmd,t);
public void D2(Trans t)
DbCommand cmd = db.GetSqlStringCommond("insert t1 (id)values(’..’)");
else db.ExecuteNonQuery(cmd, t);
}
以上我們好像沒有指定資料庫連接配接字元串,大家如果看下DbHelper的代碼,就知道要使用它必須在config中配置兩個參數,如下:
<appSettings>
<add key="DbHelperProvider" value="System.Data.SqlClient"/>
<add key="DbHelperConnectionString" value="Data Source=(local);Initial Catalog=DbHelperTest;Persist Security Info=True;User ID=sa;Password=sa"/>
</appSettings>其實,DbHelper需要的僅僅是兩個字元串,你可以自己修改,作成加密什麼的
好了,就這樣,DbHelper的代碼是非常簡單和透明的,隻是在ado.net上做了一點小包裝,改變了一下使用它的程式員的編碼方式,去除掉一些比較"實體級"的程式設計概念,如connection的open和close之類的,使程式員更專注于業務邏輯代碼的編寫,少死掉點腦細胞,另外,統一了資料操作層的資料操作代碼的風格和格式,維護起來很友善的撒~~~
另:以上代碼大家可以随意使用, 不需要給我版權費的啦,嘿嘿.如果大家發現有什麼BUG,或者有更好的資料操作類的實作方式,請聯系我哦.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace GraduationProject.DAL
{
public static class DBHelper
{
private static SqlConnection connection;
public static SqlConnection Connection
{
get
{
//string connectionString = ConfigurationManager.ConnectionStrings["GraduationProjectDB"].ConnectionString;
if (connection == null)
{
connection = new SqlConnection("server=.;database=GraduationProjectDB;User ID=sa;password=123456;");
//connection.ConnectionString = "server=.;database=GraduationProjectDB;User ID=sa;password=;";
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Closed)
else if (connection.State == System.Data.ConnectionState.Broken)
connection.Close();
return connection;
}
}
public static int ExecuteCommand(string safeSql)
SqlCommand cmd = new SqlCommand(safeSql, Connection);
int result = cmd.ExecuteNonQuery();
return result;
public static int ExecuteCommand(string sql, params SqlParameter[] values)
SqlCommand cmd = new SqlCommand(sql, Connection);
cmd.Parameters.AddRange(values);
int result=cmd.ExecuteNonQuery();
public static int GetScalar(string safeSql)
int result = Convert.ToInt32(cmd.ExecuteScalar());
public static int GetScalar(string sql, params SqlParameter[] values)
public static SqlDataReader GetReader(string safeSql)
SqlDataReader reader = cmd.ExecuteReader();
return reader;
public static SqlDataReader GetReader(string sql, params SqlParameter[] values)
public static DataTable GetDataSet(string safeSql)
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
return ds.Tables[0];
public static DataTable GetDataSet(string sql, params SqlParameter[] values)
}
}