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
}