ADO.Net資料庫存取

摘要: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,否則繼續進行成功後回傳資料表。