摘要:ADO.Net資料庫存取
動態網站中常常需要與資料庫互動。為了盡到物件導向程式的reuse特性,
我將常用到的ADO.NET存取資料庫方式做成一個類別,
程式要與資料庫互動時再引用這個類別,呼叫裡面的方法即可,程式如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
namespace careerfairadmin
{
public class DBUtil
{
SqlConnection conn = null;
SqlCommand cmd = null;
SqlTransaction trans = null;
SqlDataAdapter adapter = null;
DataSet ds = null;
public DBUtil(string str)
{
conn = new SqlConnection(connectionString(str));
open();
}
/// <summary>
/// 連線字串
/// </summary>
private string connectionString(string str)
{
return ConfigurationManager.ConnectionStrings[str].ConnectionString;
}
/// <summary>
/// 開啟資料庫連線
/// </summary>
public void open()
{
conn.Open();
}
/// <summary>
/// 尋找 (command:sql命令,commandtype:cmd型態,parameters:參數)
/// </summary>
public DataTable select(string command, string commandtype, List<object> parameters, List<object> parameters_value)
{
cmd = new SqlCommand(command, conn);
cmd.CommandTimeout = 120;
trans = conn.BeginTransaction();
cmd.Transaction = trans;
ds = new DataSet();
for (int index = 0; index < parameters.Count; index++)
{
cmd.Parameters.AddWithValue(parameters[index].ToString(), parameters_value[index]);
}
try
{
if (commandtype.Equals("StoredProcedure"))
cmd.CommandType = CommandType.StoredProcedure;
adapter = new SqlDataAdapter(cmd);
adapter.Fill(ds);
trans.Commit();
}
catch
{
//有問題即Rollback
trans.Rollback();
}
cmd.Dispose();
conn.Close();
return ds.Tables[0];
}
}
}
因為我的程式與資料庫互動,不管是select、insert、update、delete,都是透過store procedure,
因此我只做了一個select的方法,把所有store procedure都丟給這個方法處理。
public DataTable select(string command, string commandtype, List<object> parameters, List<object> parameters_value) { }
command是sql命令,commandtype是command型態,parameters是參數,parameters_value是參數值。
其中parameters與parameters_value的型態為強型別集合,其餘程式就是基本的ADO.NET程式,比較特別的是,
for (int index = 0; index < parameters.Count; index++)
{
cmd.Parameters.AddWithValue(parameters[index].ToString(), parameters_value[index]);
}
這段迴圈是為了丟參數和參數值給store procedure,並且將參數值均視為字串型態,避免sql injection。
最後在try catch裡做store procedure的執行,有例外便rollback,否則繼續進行成功後回傳資料表。