本人目前在實習,還沒有畢業,哈哈------還是一小弟。之前在學校中做了些小的專案,自己總結的關於資料庫操作的類,對於一些小的專案還是很有幫助的,現在一直在做silverlight的專案,目前連資料庫長什麼樣都沒有見過-----伺服器不是偶寫的,因為剛來也沒好意思問。
初來駕到,又如bug還請多多指教。
先貼程式碼吧。
using System.Data;
using System.Data.SqlClient;
namespace D.King.DB
{
public class DBOperator
{
private string connStr;
private SqlConnection conn;
public delegate void getParams(SqlCommand comm);
public delegate void getReader(IDataReader dataReader);
public DBOperator()
{
//連線字串自己看著辦
connStr ="Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=BaseStation3;Data Source=.";
conn = new SqlConnection(connStr);
}
public DBOperator(string connStr)
{
this.connStr = connStr;
conn = new SqlConnection(connStr);
}
/// <summary>
/// 開啟連線
/// </summary>
private void openConn()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
else
{
conn.Close();
conn.Open();
}
}
/// <summary>
/// 關閉連線
/// </summary>
private void closeConn()
{
if (conn.State != ConnectionState.Closed)
conn.Close();
}
/// <summary>
/// 獲取連線字串
/// </summary>
public string ConnString
{
get
{
return connStr;
}
}
/// <summary>
/// 獲得查詢的表
/// </summary>
/// <param name="sql">TSQL或儲存過程</param>
/// <param name="getparam">引數新增方法</param>
/// <returns>DataTable</returns>
public DataTable getTable(string sql, getParams getparam)
{
SqlCommand comm = new SqlCommand(sql, conn);
SqlDataAdapter da = new SqlDataAdapter();
if (getparam != null)
{
getparam(comm);
}
da.SelectCommand = comm;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
/// <summary>
/// 獲得查詢的資料集
/// </summary>
/// <param name="sql">TSQL或儲存過程</param>
/// <param name="getparam">引數新增方法</param>
/// <returns>DataSet</returns>
public DataSet getDataSet(string sql, getParams getparam)
{
SqlCommand comm = new SqlCommand(sql, conn);
SqlDataAdapter da = new SqlDataAdapter();
if (getparam != null)
{
getparam(comm);
}
da.SelectCommand = comm;
DataSet dt = new DataSet();
da.Fill(dt);
return dt;
}
/// <summary>
/// 執行TSQL或儲存過程
/// </summary>
/// <param name="sql">TSQL或儲存過程</param>
/// <param name="getparam">引數新增方法</param>
/// <returns>影響的行數</returns>
public int Execute(string sql, getParams getparam)
{
int result = 0;
SqlCommand comm = new SqlCommand(sql, conn);
if (getparam != null)
{
getparam(comm);
}
openConn();
result = comm.ExecuteNonQuery();
closeConn();
return result;
}
/// <summary>
/// 執行dataReader繫結資料
/// </summary>
/// <param name="sql">查詢語句</param>
/// <param name="reader">reader繫結方法</param>
public void GetDataReader(string sql,getReader reader)
{
SqlCommand comm = new SqlCommand(sql,conn);
openConn();
if (reader != null)
{
reader(comm.ExecuteReader());
}
closeConn();
}
/// <summary>
/// 執行dataReader繫結資料
/// </summary>
/// <param name="sql">查詢語句或儲存過程</param>
/// <param name="getparam">儲存過程引數繫結</param>
/// <param name="reader">reader繫結方法</param>
public void GetDataReader(string sql,getParams getparam, getReader reader)
{
SqlCommand comm = new SqlCommand(sql, conn);
if (getparam != null)
getparam(comm);
openConn();
if (reader != null)
{
reader(comm.ExecuteReader());
}
closeConn();
}
}
}
下面是關於如何使用這個類。
1.讀取資料
DBOperator db=new DBOperator();
DataTable dt=db.getTable("select * from table1",null);
或者:dt=db.getTable("select * from table1 where id=@id",setPama);
現在需要一個setParam的定義如下:
private void setPama(SqlCommand comm)
{
comm.Parameters.AddWithValue("@id",id);
//後面的那個id當然是一個變數了,@id是上面select語句中的一個臨時變數。
}
2.資料操作
int num=db.Execute("insert into table1 (id,name) values(@id,@name)",setPama);//num的值就是資料庫操作後返回的影響的行數,可以通過num的值判斷是否修改成功。
private void setPama(SqlCommand comm)
{
comm.Parameters.AddWithValue("@id",id);//這個和讀取資料中的意思差不多
comm.Parameters.AddWithValue("@name",name);//一共定義了兩個變數,所以就兩句咯
}
3.呼叫儲存過程
int num =db.db.Execute("pro_test",setPama);//pro_test這個是資料庫中儲存過程的名字,setPama還是為儲存過程的引數設定值,第二個引數是不允許為空的----儲存過程的內容就不貼出來了
private void setPama(SqlCommand comm)
{
comm.Parameters.AddWithValue("@id",id);//這個@id是資料庫中的儲存過程中定義的引數的名稱。
comm.CommandType = CommandType.StoredProcedure;//這一句可是說明使用的是儲存過程,這也是為什麼上面提到的第二個引數不能為空的原因。
}
4.DataReader的我就不貼程式碼了。
幾乎所有的資料庫操作都包含在內了,對於小型的專案個人感覺還是比較好了。
對於設計模式,我瞭解的比較少,現在剛剛入門了一個MVVM,不知道在大型的專案中這個東西還好不好使。。。。