封裝帶類---dataset datareader 用法

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;

/// <summary>
/// 表BMS_Play的封裝
/// [提供功能]
///     1.劇集的增、刪、改(主要靠本類中的靜態方法實現)
///     2.對錶中所有字段及其他相關重要信息的封裝(主要靠實例化的方法與屬性訪問)
/// [名詞解釋]
///     1.劇集系列:由於同一套劇集有多套版本或拷貝,因此把具有相同劇集名的劇集記錄分類爲同一劇集系列.
///                而劇集系列又分爲母帶系列及素材帶系列.
///     2.SN頭3位字母:涉及到BETA帶 SN的命名規則.SN命名規則如下:
///                   -SN碼格式: ABC-000-0000 (SN頭-總集數-當前編號)
///                   -當前編號定義規則見 類的公共方法 AddPlay()                   
/// </summary>
public class Play
{
   
    /// <summary>
    /// 構造函數(向其提供一個無效的ID會引發異常)
    /// </summary>
    /// <param name="play_id"></param>
 public Play(string play_id)
 {
        using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
               
            string sql = "SELECT * FROM BMS_Play WHERE play_id = " + play_id.ToString();
            SqlCommand cmd = new SqlCommand(sql, conn);
            SqlDataReader dr = cmd.ExecuteReader();

            dr.Read();

            _play_id = dr["play_id"].ToString();
            _play_name = dr["play_name"].ToString();
            _play_volume = dr["play_volume"].ToString();
            _play_format = dr["play_format"].ToString();
            _play_edition = dr["play_edition"].ToString();
            _play_description = dr["play_description"].ToString();
            _play_type = (PlayType)dr["play_type"];

            dr.Close();
        }
    }

    /// <summary>
    /// 劇集類型,依次爲“母帶原版”, “母帶拷貝”, “素材帶原版”, “素材帶拷貝”
    /// </summary>
    public enum PlayType { ORIGIN, COPY, MORIGIN, MCOPY };  

    #region 表中各字段
    string _play_id;
    string _play_description;
    string _play_name;
    string _play_volume;
    string _play_format;
    string _play_edition;
    PlayType _play_type;
    #endregion

    #region 類中的公共屬性   
   
    /*
     * 基本屬性
     */
    public PlayType Play_Type
    {
        get
        {
            return _play_type;
        }
    }
    public string Play_id
    {
        get { return _play_id; }
    } 
    public string Play_name
    {
        get { return _play_name; }
    }   
    public string Play_volume
    {
        get { return _play_volume; }
    }   
    public string Play_format
    {
        get { return _play_format; }
    }   
    public string Play_edition
    {
        get { return _play_edition; }
    }
    public string Play_description
    {
        get { return _play_description; }
    }

    /*
     * 其他屬性
     */

    /// <summary>
    /// 獲取劇集所擁有的集數
    /// </summary>
    public int CurVolCount
    {
        get
        {
            int count = int.Parse(_play_volume);
            foreach (DataRow dr in Volumes.Tables[0].Rows)
            {
                Volume vol = new Volume(dr["volume_id"].ToString());
                if (vol.State == Tape.TapeState.UNAVAILABLE)
                {
                    count--;
                }
            }
            return count;
        }
    }

    /// <summary>
    /// 獲取劇集所有集數據
    /// </summary>
    public DataSet Volumes
    {
        get
        {
            using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                string sql = "SELECT * FROM BMS_Volume WHERE play_id = " + _play_id;
                SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
                DataSet ds = new DataSet();
                adp.Fill(ds);
                return ds;
            }
        }
    }

    /// <summary>
    /// 劇集借還狀態(過時,不建議使用)
    /// </summary>
    public Tape.TapeState State
    {
        get
        {
            Volume vol = new Volume(Volumes.Tables[0].Rows[0]["volume_id"].ToString());
            return vol.State;
        }
    }

    #endregion

    #region 類中的靜態屬性(封裝了關於整張BMS_Play表的一些屬性)

    /// <summary>
    /// 獲取所有劇集數據
    /// </summary>
    static public DataSet DataSet
    {
        get
        {
            using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                string sql = "SELECT * FROM BMS_Play";
                SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
                DataSet ds = new DataSet();
                adp.Fill(ds);
                return ds;
            }
        }
    }

    /// <summary>
    /// 獲取所有劇集系列名的字符串
    /// </summary>
    static public ArrayList PlayNames
    {
        get
        {
            using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                string sql = "SELECT DISTINCT play_name FROM BMS_Play";
                SqlCommand cmd = new SqlCommand(sql, conn);
                SqlDataReader dr = cmd.ExecuteReader();

                ArrayList names = new ArrayList(50);
                while (dr.Read())
                {
                    names.Add(dr["play_name"].ToString());
                }
                dr.Close();
                return names;

            }
        }
    }

    /// <summary>
    /// 由劇集名檢索出該劇集系列的原版劇集ID
    /// </summary>
    /// <param name="name">劇集名</param>
    /// <returns></returns>
    static public int GetIdByName(string name)
    {
        using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            string sql = "SELECT play_id FROM BMS_Play WHERE play_name = @name and play_type = @type";
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.Add("@name", SqlDbType.NVarChar);
            cmd.Parameters["@name"].Value = name;
            cmd.Parameters.Add("@type", SqlDbType.Int);
            cmd.Parameters["@type"].Value = (int)PlayType.ORIGIN;

            if (cmd.ExecuteScalar() != null)
            {
                return (int)cmd.ExecuteScalar();
            }
            else
            {
                return -1;
            }
        }
    }

    #endregion

    #region 公共成員方法
    /// <summary>
    /// 獲取劇集的SN頭3個字母
    /// </summary>
    /// <returns></returns>
    public string GetSnHeader()
    {
        using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            string sql = "SELECT  TOP (1) BMS_Tape.tape_sn "
            + "FROM  BMS_Tape INNER JOIN "
            + "BMS_Volume ON BMS_Tape.volume_id = BMS_Volume.volume_id INNER JOIN "
            + "BMS_Play ON BMS_Volume.play_id = BMS_Play.play_id "
            + "WHERE     (BMS_Play.play_id =" + _play_id + ")";

            SqlCommand cmd = new SqlCommand(sql, conn);
            string sub = (string)cmd.ExecuteScalar();
            return (sub.Split('-'))[0];
        }
    }

    /// <summary>
    /// 新增一條劇集記錄
    /// </summary>
    /// <param name="name">劇集名</param>
    /// <param name="vol">集數</param>
    /// <param name="snHeader">SN頭3位字母</param>
    /// <param name="length">每集長度</param>
    /// <param name="format">格式</param>
    /// <param name="edition">版本</param>
    /// <param name="description">描述</param>
    /// <param name="type">劇集系列類型</param>
    /// <param name="source_id">源劇集的ID號,若本身爲母帶原版則取-1</param>
    /// <returns>返回新添加記錄的ID號</returns>
    ///

    /*
     * 劇集添加流程:(本流程的數個數據庫操作請改爲一項事務,保證數據的完整 !!!!)
     * 1.根據參數 先創建一條劇集記錄,並獲得其ID(id)
     * 2.根據參數vol,爲id創建N條volume的記錄,併爲每條volume記錄創建1條tape的記錄    
     */
    static public int Add(string name, string vol,string snHeader, string length,string format, string edition, string description, PlayType type, string source_id)
    {
        
        using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }

           
            //new a play
            string sql = "INSERT INTO BMS_Play (play_name, play_volume, play_format, play_edition, play_description, play_type,source_id) "
                    + "VALUES (@name, @vol, @format, @edition, @desc, @type, @source_id);"
                    + "SELECT CAST(scope_identity() AS int)";

            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.Add("@name", SqlDbType.NVarChar);
            cmd.Parameters.Add("@vol", SqlDbType.Int);
            cmd.Parameters.Add("@format", SqlDbType.NVarChar);
            cmd.Parameters.Add("@edition", SqlDbType.NVarChar);
            cmd.Parameters.Add("@desc", SqlDbType.NVarChar);
            cmd.Parameters.Add("@type", SqlDbType.Int);
            cmd.Parameters.Add("@source_id", SqlDbType.Int);

            cmd.Parameters["@name"].Value = name;
            cmd.Parameters["@vol"].Value = int.Parse(vol);
            cmd.Parameters["@format"].Value = format;
            cmd.Parameters["@edition"].Value = edition;
            cmd.Parameters["@desc"].Value = description;
            cmd.Parameters["@type"].Value = type;
            cmd.Parameters["@source_id"].Value = int.Parse(source_id);

            int id = int.Parse(cmd.ExecuteScalar().ToString());

            //判斷本劇集的系列類型,如果爲素材帶系列的則僅添加一集不帶TAPE的空白VOLUME,函數返回
            if (type == PlayType.MORIGIN || type == PlayType.MCOPY)
            {
                Volume.Add(id.ToString(), snHeader, "請添加描述");
                return id;
            }
           

            //如果劇集爲母帶系列,則插入相應的volume和tape記錄
           
            //獲取本PLAY記錄下的TAPE SN的後4位數字的起始數
            int startNum = 0;   //sn 起始數
            string query = "SELECT COUNT(*) FROM BMS_Play WHERE play_name = @name and play_volume = @vol";
            cmd.CommandText = query;
            startNum = (int)cmd.ExecuteScalar() - 1;
            startNum *= int.Parse(vol);
          
            //創建volume 及 tape的記錄
            for (int i = 1; i <= int.Parse(vol); i++)
            {
                int vol_id = Volume.Add(id.ToString(), "第" + i.ToString() + "集", "請添加描述");
                Tape.Add(vol_id.ToString(), snHeader + "-" + (int.Parse(vol)).ToString("000") + "-" + (startNum + i).ToString("0000"), length, "請添加描述");
            }

            return id;
        }
       
    }

    /// <summary>
    /// 刪除一條劇集記錄(數據庫中的設定爲,只要刪除某劇集記錄,與之相關的記錄集如volume, tape等均會被刪除)
    /// </summary>
    /// <param name="id">劇集ID</param>
    /// <returns></returns>
    static public bool Erase(string id)
    {
        Play play = new Play(id);
        if (play.State == Tape.TapeState.LOANED)
        {
            return false;
        }
        using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            string sql;
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            sql = "DELETE FROM BMS_Play WHERE play_id = " + id;
            cmd.CommandText = sql;
            cmd.ExecuteNonQuery();
            return true;
        }
    }


    /// <summary>
    /// 獲取劇集系列各類型的字符串形式(用於GRIDVIEW數據綁定)
    /// </summary>
    /// <param name="type">劇集系列類型的枚舉</param>
    /// <returns></returns>
    static public string GetTypeStr(Play.PlayType type)
    {
        switch (type)
        {
            case PlayType.ORIGIN:
                return "母帶";               
            case PlayType.COPY:               
                return "拷貝";
            case PlayType.MORIGIN:
                return "素材帶";
            case PlayType.MCOPY:
                return "素材帶拷貝";
            default:
                return "未知";
        }
    }

    /// <summary>
    /// 獲取所有劇集記錄中的某類型的劇集記錄集
    /// </summary>
    /// <param name="type"></param>
    /// <returns></returns>
    static public DataTable GetPlayByType(PlayType type)
    {
        using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            string sql = "SELECT * FROM BMS_Play WHERE play_type =" + (int)type;
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            DataTable dt = new DataTable();
            adp.Fill(dt);
            return dt;
           
        }
    }

 


    /// <summary>
    /// 修改某一劇集記錄的資料
    /// </summary>
    /// <param name="id"></param>
    /// <param name="name"></param>
    /// <param name="format"></param>
    /// <param name="edition"></param>
    /// <param name="desc"></param>
    /// <returns></returns>
    static public bool Update(string id, string name, string format, string edition, string desc)
    {
        using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }

            string sql = "UPDATE    BMS_Play"
            + " SET play_name =@name,play_format =@format, play_edition =@edition, play_description =@desc"
            +" WHERE play_id = " + id;


            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.Add("@name", SqlDbType.NVarChar);
            cmd.Parameters.Add("@format", SqlDbType.NVarChar);
            cmd.Parameters.Add("@edition", SqlDbType.NVarChar);
            cmd.Parameters.Add("@desc", SqlDbType.NVarChar);

            cmd.Parameters["@name"].Value = name;
            cmd.Parameters["@format"].Value = format;
            cmd.Parameters["@edition"].Value = edition;
            cmd.Parameters["@desc"].Value = desc;

            if (cmd.ExecuteNonQuery() == 1)
            {
                return true;
            }
            else
            {
                return false;
            }               

        }
    }

 

   /// <summary>
   /// 獲取所有劇集系列的記錄集
   /// </summary>
   /// <returns></returns>
    static public DataSet GetPlayList()
    {
        using (SqlConnection conn = new SqlConnection(Utility.ConnectionString))
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }

            string sql = "SELECT DISTINCT play_name FROM BMS_Play";
            SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            adp.Fill(ds);
            return ds;
           
        }
    }
    #endregion
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章