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
}