ADO.NET很好, 但是有時候訪問數據庫你就覺得有些繁瑣了。利用封裝,我們可以輕鬆地訪問數據庫,而無須考慮太多操作細節。注意:下面的類MyDatabase中的連接字符串從應用程序配置中讀取。
*
*
* 示例:
* MyDatabase db = new MyDatabase(); // 首先創建一個MyDataBase對象
*
* 查詢數據:
* DataTable table = db.GetRecords("Product", (new string[]{"name", "price"}, null);
* foreach(DataRow row in table.rows) {
* ...
* }
*
* 添加一條記錄:
* ColumnEntry entries = new ColumnEntry[] {
* new ColumnEntry("name", OleDbDbType.NChar, "Guitar"),
* new ColumnEntry("price", OleDbDbType.Decimal, 1000.0)
* };
* db.AddRecord("Product", entries);
*
* 更新一條記錄:
* ColumnEntry entries = new ColumnEntry[] {
* new ColumnEntry("name", OleDbType.NChar, "Eelectric-Guitar"),
* new ColumnEntry("price", OleDbType.Decimal, 1200.0)
* };
* db.UpdateRecord("Product", entries, "productid=100");
*
*****************************************************************************/
using System;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Collections;
using System.Configuration;
namespace OOHacker.Example
...{
// 列入口
public class ColumnEntry
...{
public ColumnEntry()
...{
colName = null;
colDataType = OleDbType.Char;
colValue = null;
}
// Constructor
public ColumnEntry(string _colName, OleDbType _colDataType, object _colValue)
...{
colName = _colName;
colDataType = _colDataType;
colValue = _colValue;
}
// 列名屬性,可讀寫
public string ColName
...{
set
...{
colName = value;
}
get
...{
return colName;
}
}
// 列數據類型屬性,可讀寫
public OleDbType ColDataType
...{
set
...{
colDataType = value;
}
get
...{
return colDataType;
}
}
// 列值屬性,可讀寫
public object ColValue
...{
set
...{
colValue = value;
}
get
...{
return colValue;
}
}
private string colName; // 列名
private OleDbType colDataType; // 列數據類型
private object colValue; // 列值
};
/**//// <summary>
/// 數據庫操縱類
/// </summary>
public class MyDatabase
...{
public MyDatabase()
...{
connString = ConfigurationManager.AppSettings["DBConnectionString"];
conn = new OleDbConnection(connString);
}
/**//// <summary>
/// 執行非查詢SQL語句;
/// </summary>
/// <param name="strSql">非SELECT的SQL</param>
/// <returns>成功時返回時true,失敗返回false</returns>
public bool ExecuteSqlNoQuery(string strSql)
...{
bool ret = false;
errMsg = "";
OleDbTransaction trans = null;
if (Open())
...{
try
...{
trans = conn.BeginTransaction();
OleDbCommand cmd = new OleDbCommand(strSql, conn, trans);
cmd.ExecuteNonQuery();
trans.Commit();
ret = true;
}
catch (Exception e)
...{
trans.Rollback();
errMsg = e.Message;
}
finally
...{
conn.Close();
}
}
return ret;
}
/**//// <summary>
/// 本方法封裝了獲取數據的過程,只需提供表名,以及相應的列名,條件即可。
/// </summary>
/// <param name="table">表名</param>
/// <param name="cols">若cols爲空(null),則返回所有列(字段);否則返回對應列</param>
/// <param name="sWhere">若要返回全部記錄,sWhere應爲空(null);否則返回指定記錄</param>
/// <returns>成功時返回一個DataTable對象,失敗時返回null</returns>
public DataTable GetRecords(string table, string[] cols, string sWhere)
...{
errMsg = "";
if (!Open()) return null;
// 構造SQL查詢語句
StringBuilder sqlBuilder = new StringBuilder(256);
sqlBuilder.Append("select ");
for (int i = 0; i < cols.Length; ++i)
...{
sqlBuilder.AppendFormat("[{0}]", cols[i]);
if (i < cols.Length - 1)
...{
sqlBuilder.Append(",");
}
}
sqlBuilder.AppendFormat(" from {0}", table);
if (sWhere != null && sWhere.Trim() != "")
...{
sqlBuilder.AppendFormat(" where {0}", sWhere);
}
// 執行查詢,返回查詢結果
DataTable recs = null;
try
...{
DataSet ds = new DataSet();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(sqlBuilder.ToString(), conn);
adapter.Fill(ds, table);
recs = ds.Tables[table];
}
catch (Exception e)
...{
errMsg = e.Message;
recs = null;
}
finally
...{
conn.Close();
}
return recs;
}
/**//// <summary>
/// 添加一條記錄.本方法封裝了添加數據的過程,只需提供表名,以及相應的列名,值及數據類型即可。
/// </summary>
/// <param name="table">指定更新表</param>
/// <param name="entries">要更新的列。不能爲空</param>
/// <returns>成功時返回true,失敗返回false;</returns>
public bool AddRecord(string table, ColumnEntry[] entries)
...{
errMsg = "";
OleDbTransaction trans = null;
if (!Open()) return false;
// 構造SQL插入語句
StringBuilder sb1 = new StringBuilder(256);
StringBuilder sb2 = new StringBuilder(256);
sb1.AppendFormat("insert into {0}(", table);
sb2.Append("values(");
for (int i = 0; i < entries.Length; ++i)
...{
sb1.AppendFormat("[{0}]", entries[i].ColName.Trim());
sb2.AppendFormat("@p{0}", entries[i].ColName.Trim());
if (i < entries.Length - 1)
...{
sb1.Append(",");
sb2.Append(",");
}
}
sb1.Append(") ");
sb2.Append(") ");
sb1.Append(sb2.ToString());
// 構造插入命令及參數
OleDbCommand cmd = new OleDbCommand(sb1.ToString(), conn);
OleDbParameterCollection paras = cmd.Parameters;
for (int i = 0; i < entries.Length; ++i)
...{
try
...{
string paraName = "@p" + entries[i].ColName.Trim();
paras.Add(paraName, entries[i].ColDataType);
paras[paraName].Value = entries[i].ColValue;
}
catch (Exception e)
...{
errMsg = "構造命令參數失敗!原因:" + e.Message;
conn.Close();
return false;
}
}
bool successed = false;
// 提交插入命令,更新數據源
try
...{
trans = conn.BeginTransaction();
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
trans.Commit();
successed = true;
}
catch (Exception e)
...{
trans.Rollback();
errMsg = e.Message;
}
finally
...{
conn.Close();
}
return successed;
}
/**//// <summary>
/// 更改記錄。本方法封裝了更改數據的過程,只需提供表名,以及相應的列名,值及數據類型和
/// 條件即可。
/// </summary>
/// <param name="table">指定更新表</param>
/// <param name="entries">指定要更新的列</param>
/// <param name="sWhere">更新條件</param>
/// <returns></returns>
public bool UpdateRecord(string table, ColumnEntry[] entries, string sWhere)
...{
errMsg = "";
OleDbTransaction trans = null;
if (!Open()) return false;
// 構造SQL插入語句
StringBuilder sb1 = new StringBuilder(256);
sb1.AppendFormat("update {0} set ", table);
for (int i = 0; i < entries.Length; ++i)
...{
sb1.AppendFormat("[{0}]=@p{0}", entries[i].ColName.Trim());
if (i < entries.Length - 1)
...{
sb1.Append(",");
}
}
sb1.AppendFormat(" where {0}", sWhere);
// 構造更新命令及參數
OleDbCommand cmd = new OleDbCommand(sb1.ToString(), conn);
OleDbParameterCollection paras = cmd.Parameters;
for (int i = 0; i < entries.Length; ++i)
...{
try
...{
string paraName = "@p" + entries[i].ColName.Trim();
paras.Add(paraName, entries[i].ColDataType);
paras[paraName].Value = entries[i].ColValue;
}
catch (Exception e)
...{
errMsg = "構造命令參數失敗!原因:" + e.Message;
conn.Close();
return false;
}
}
bool successed = false;
// 提交插入命令,更新數據源
try
...{
trans = conn.BeginTransaction();
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
trans.Commit();
successed = true;
}
catch (Exception e)
...{
trans.Rollback();
errMsg = e.Message;
}
finally
...{
conn.Close();
}
return successed;
}
public String ConnString
...{
set
...{
connString = value;
}
get
...{
return connString;
}
}
public string errMessage
...{
get
...{
return errMsg;
}
}
private bool Open()
...{
bool isOpen = false;
errMsg = "";
try
...{
conn.Open();
isOpen = true;
}
catch (Exception e)
...{
errMsg = "打開數據庫失敗" + e.Message;
}
return isOpen;
}
private OleDbConnection conn;
private String connString;
private String errMsg;
}
}