图书馆管理系统简介

来源:互联网 发布:述茫的爱爱上你我傻乎 编辑:程序博客网 时间:2024/04/29 11:49

----------------

设计到很简单的几个功能,用户注册,修改密码,借书,还书,添加书籍,修改书籍,删除书籍,查找书籍
以及对用户的管理即管理员可以对非管理员进行增删改操作.
首先分析下框架
典型的三层架构:每个实体对应一个类 此处涉及到了books,borrow,users类.
此后就是数据库操作类database了.所有的数据库相关操做都在这个类里封装了.
下面具体讲解下
users类.
 
 public class Users
    {
        #region 私有成员
        private string _userID;                                               //用户编号
        #endregion 私有成员

        #region 属性

        public string UserID
        {
            set
            {
                this._userID = value;
            }
            get
            {
                return this._userID;
            }
        }
该类中会有如上的成员和属性,对应的都是数据库中表的字段.还包含了对user类的业务操作判断用户存在性等等

        //根据UserID和UserPassword判断密码是否正确
        //输入:
        //      XUserID - 用户编号;       
        //输出:
        //      用户存在:返回True;
        //      用户不在:返回False;
        public bool CheckPassword(string XUserID)
        {
            SqlParameter[] Params = new SqlParameter[1];
            DataBase DB = new DataBase();
            Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, XUserID);                  //教工姓名           

            SqlDataReader DR = DB.RunProcGetReader("Proc_UsersDetail", Params);
            if (!DR.Read())
            {
                return false;
            }
            else
            {
                this._userPassword = DR["UserPassword"].ToString();
                this._userPower = int.Parse(DR["UserPower"].ToString());
                return true;
            }
        }
    

        //向Users表中添加用户信息(采用存储过程)
        //输出:
        //      插入成功:返回True;
        //      插入失败:返回False;
        public bool InsertByProc()
        {
            SqlParameter[] Params = new SqlParameter[8];

            DataBase DB = new DataBase();

            Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, UserID);               //用户编号
            Params[1] = DB.MakeInParam("@UserPassword", SqlDbType.VarChar,50, UserPassword);    //用户密码
            Params[2] = DB.MakeInParam("@UserPower", SqlDbType.SmallInt, 2, UserPower);         //用户权限
            Params[3] = DB.MakeInParam("@UserName", SqlDbType.VarChar, 50, UserName);           //用户姓名
            Params[4] = DB.MakeInParam("@UserSex", SqlDbType.Bit,1, UserSex);                   //用户性别
            Params[5] = DB.MakeInParam("@UserDepart", SqlDbType.VarChar,50, UserDepart);        //用户系院
            Params[6] = DB.MakeInParam("@UserTelephone", SqlDbType.VarChar, 50, UserTelephone); //用户电话
            Params[7] = DB.MakeInParam("@UserEMail", SqlDbType.VarChar, 50, UserEMail);         //用户EMail

            int Count = -1;
            Count = DB.RunProc("Proc_UsersAdd", Params);
            if (Count > 0)
                return true;
            else return false;
        }

        //更新用户的信息
        public bool UpdateByProc(string XUserID)
        {
            SqlParameter[] Params = new SqlParameter[6];

            DataBase DB = new DataBase();//Dababase类 用来和数据库打交道

            Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, XUserID);               //用户编号           
            Params[1] = DB.MakeInParam("@UserPower", SqlDbType.SmallInt, 2, UserPower);         //用户权限
            Params[2] = DB.MakeInParam("@UserName", SqlDbType.VarChar, 50, UserName);           //用户姓名           
            Params[3] = DB.MakeInParam("@UserDepart", SqlDbType.VarChar, 50, UserDepart);        //用户系院
            Params[4] = DB.MakeInParam("@UserTelephone", SqlDbType.VarChar, 50, UserTelephone); //用户电话
            Params[5] = DB.MakeInParam("@UserEMail", SqlDbType.VarChar, 50, UserEMail);         //用户EMail

            int Count = -1;
            Count = DB.RunProc("Proc_UsersModify", Params);
            if (Count > 0)
                return true;
            else return false;
        }
---------------------------------------------------------


-下面是具体的database类
using System;
using System.Data;
using System.Collections;
using System.Data.SqlClient;
using System.Configuration;

namespace MyLibrary.DataAccessLayer
{
  // 数据库接口类
 public class DataBase
 {
  //私有变量,数据库连接
  protected SqlConnection Connection;
        protected string ConnectionString;

  //构造函数
  public DataBase()
  {
            ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        }
  
  //保护方法,打开数据库连接
  private void Open()
  {
    //判断数据库连接是否存在
   if (Connection == null)
   {
     //不存在,新建并打开
    Connection = new SqlConnection(ConnectionString);
    Connection.Open();
   }
   else
   {
     //存在,判断是否处于关闭状态
     if (Connection.State.Equals(ConnectionState.Closed))
      Connection.Open();    //连接处于关闭状态,重新打开
   }
  }

  //公有方法,关闭数据库连接
  public void Close()
  {
   if (Connection.State.Equals(ConnectionState.Open))
   {
    Connection.Close();     //连接处于打开状态,关闭连接
   }
  }

        /// <summary>
  /// 析构函数,释放非托管资源
  /// </summary>
  ~DataBase()
  {
   try
   {
    if (Connection != null)
     Connection.Close();
   }
   catch{}
   try
   {
    Dispose();
   }
   catch{}
  }

  //公有方法,释放资源
  public void Dispose()
  {
   if (Connection != null)  // 确保连接被关闭
   {
    Connection.Dispose();
    Connection = null;
   }
  }  

  //公有方法,根据Sql语句,返回是否查询到记录
  public bool GetRecord(string XSqlString)
  {
            Open();
            SqlDataAdapter adapter = new SqlDataAdapter(XSqlString, Connection);
            DataSet dataset = new DataSet();
            adapter.Fill(dataset);
            Close();

            if (dataset.Tables[0].Rows.Count > 0)
   {
    return true;
   }
   else
   {
    return false;
   }
  }

  //公有方法,返回Sql语句获得的数据值
  //SqlString的格式:select count(*) from XXX where ...
  //                 select max(XXX) from YYY where ...
  public int GetRecordCount(string XSqlString)
  {
            string SCount;

   Open();
   SqlCommand Cmd = new SqlCommand(XSqlString,Connection);
            SCount = Cmd.ExecuteScalar().ToString().Trim();
            if (SCount=="")
            SCount="0";
   Close();
   return Convert.ToInt32(SCount);
  }   

  //公有方法,根据XWhere更新数据表XTableName中的某些纪录
  //XTableName--表名
  //XHT--哈希表,键为字段名,值为字段值  
  public DataSet AdvancedSearch(string XTableName, Hashtable XHT)
  {
   int Count = 0;

   string Fields = "";
   foreach(DictionaryEntry Item in XHT)
   {
    if (Count != 0)
    {
     Fields += " and ";
    }
    Fields += Item.Key.ToString();
    Fields += " like '%";
    Fields += Item.Value.ToString();
                Fields += "%'";
    Count++;
   }
   Fields += " ";

   string SqlString = "select * from " + XTableName + " where " + Fields;
            Open();
            SqlDataAdapter Adapter = new SqlDataAdapter(SqlString, Connection);
            DataSet Ds = new DataSet();
            Adapter.Fill(Ds);
            Close();
            return Ds;
   
  }  

        //私有方法,获得一个用来调用存储过程的SqlCommand
        //输入:
        //      ProcName - 存储过程名
        //      Params   - 用来调用存储过程的参数表
        private SqlCommand CreateCommand(string ProcName, SqlParameter[] Prams)
        {
          Open();
          SqlCommand Cmd = new SqlCommand(ProcName, Connection);
          Cmd.CommandType = CommandType.StoredProcedure;

          if (Prams != null)
          {
            foreach (SqlParameter Parameter in Prams)
              Cmd.Parameters.Add(Parameter);
          }

          return Cmd;
        }

        //公有方法,实例化一个用于调用存储过程的参数
        //输入:
        //      ParamName - 参数名称
        //      DbType  - 参数类型
        //      Size   - 参数大小
        //   Direction - 传递方向
        //   Value   - 值
        public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)
        {
          SqlParameter Param;

          if(Size > 0)
            Param = new SqlParameter(ParamName, DbType, Size);
          else Param = new SqlParameter(ParamName, DbType);

          Param.Direction = Direction;

          if (Value != null)
            Param.Value = Value;

          return Param;
        }

  //公有方法,实例化一个用于调用存储过程的输入参数
  //输入:
  //      ParamName - 参数名称
  //      DbType  - 参数类型
  //      Size   - 参数大小
  //   Value   - 值
        public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)
        {
          return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
        }  

        //公有方法,调用存储过程(不带参数)
      //输入:
      //   ProcName存储过程名
        //输出:
      //      对Update、Insert、Delete操作返回影响到的行数,其他情况为-1
        public int RunProc(string ProcName)
        {
      int Count = -1;
            SqlCommand Cmd = CreateCommand(ProcName, null);
            Count = Cmd.ExecuteNonQuery();
            Close();
   return Count;
        }

        //公有方法,调用存储过程(带参数)
        //输入:
        //      ProcName - 存储过程名
        //      Params   - 用来调用存储过程的参数表
        //输出:
        //      对Update、Insert、Delete操作返回影响到的行数,其他情况为-1
        public int RunProc(string ProcName, SqlParameter[] Params)
        {
          int Count = -1;
          SqlCommand Cmd = CreateCommand(ProcName, Params);
          Count = Cmd.ExecuteNonQuery();
          Close();
          return Count;
        }

        //公有方法,调用存储过程(不带参数)
        //输入:
        //   ProcName存储过程名
      //输出:
        //   将执行结果以SqlDataReader返回
      //注意:使用后主意调用SqlDataReader.Close()方法
        public SqlDataReader RunProcGetReader(string ProcName)
        {
          SqlCommand Cmd = CreateCommand(ProcName, null);
          return Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        }

  //公有方法,调用存储过程(带参数)
  //输入:
  //   ProcName - 存储过程名
  //      Params  - 存储过程需要的参数
  //输出:
  //   将执行结果以SqlDataReader返回
  //注意:使用后主意调用SqlDataReader.Close()方法
        public SqlDataReader RunProcGetReader(string ProcName, SqlParameter[] Params)
        {
          SqlCommand Cmd = CreateCommand(ProcName, Params);
          return Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        }

        //公有方法,调用存储过程(带参数)
        //输入:
        //  ProcName - 存储过程名
        //      Params  - 存储过程需要的参数
        //输出:
        //   将执行结果以SqlDataReader返回
        //注意:使用后主意调用SqlDataReader.Close()方法
        public int RunProcGetCount(string ProcName, SqlParameter[] Params)
        {
            SqlCommand Cmd = CreateCommand(ProcName, Params);           
            string SCount;           
            SCount = Cmd.ExecuteScalar().ToString().Trim();
            if (SCount == "")
                SCount = "0";
            Close();
            return Convert.ToInt32(SCount);
        }

        //公有方法,调用存储过程(不带参数)
        //输入:
        //   ProcName存储过程名
        //输出:
        //   将执行结果以DataSet返回   
        public DataSet GetDataSet(string ProcName)
        {
            Open();
            SqlDataAdapter adapter = new SqlDataAdapter(ProcName, Connection);
            DataSet dataset = new DataSet();
            adapter.Fill(dataset);
            Close();
            return dataset;
        }

        //公有方法,调用存储过程(不带参数)
        //输入:
        //   ProcName存储过程名
        //输出:
        //   将执行结果以DataSet返回   
        public DataSet GetDataSet(string ProcName, SqlParameter[] Params)
        {
            Open();
            SqlCommand Cmd = CreateCommand(ProcName, Params);
            SqlDataAdapter adapter = new SqlDataAdapter(Cmd);
            DataSet dataset = new DataSet();
            adapter.Fill(dataset);
            Close();
            return dataset;
        }
 
 }
}

---------------------------------------------------------------------

GetSafeData.cs类

---------------------

/// <summary>
 /// 从数据库中安全获取数据,即当数据库中的数据为NULL时,保证读取不发生异常。
 /// </summary>
 public class GetSafeData
 {
  #region DataRow

  /// <summary>
  /// 从一个DataRow中,安全得到列colname中的值:值为字符串类型
  /// </summary>
  /// <param name="row">数据行对象</param>
  /// <param name="colname">列名</param>
  /// <returns>如果值存在,返回;否则,返回System.String.Empty</returns>
  public static string ValidateDataRow_S(DataRow row,string colname)
  {
   if(row[colname]!=DBNull.Value)
    return row[colname].ToString();
   else
    return System.String.Empty;
  }

  /// <summary>
  /// 从一个DataRow中,安全得到列colname中的值:值为整数类型
  /// </summary>
  /// <param name="row">数据行对象</param>
  /// <param name="colname">列名</param>
  /// <returns>如果值存在,返回;否则,返回System.Int32.MinValue</returns>
  public static int ValidateDataRow_N(DataRow row,string colname)
  {
   if(row[colname]!=DBNull.Value)
    return Convert.ToInt32(row[colname]);
   else
    return System.Int32.MinValue;
  }

        /// <summary>
        /// 从一个DataRow中,安全得到列colname中的值:值为布尔类型
        /// </summary>
        /// <param name="row">数据行对象</param>
        /// <param name="colname">列名</param>
        /// <returns>如果值存在,返回;否则,返回System.Int32.MinValue</returns>
        public static bool ValidateDataRow_B(DataRow row, string colname)
        {
            if (row[colname] != DBNull.Value)
                return Convert.ToBoolean(row[colname]);
            else
                return false;
        }

  /// <summary>
  /// 从一个DataRow中,安全得到列colname中的值:值为浮点数类型
  /// </summary>
  /// <param name="row">数据行对象</param>
  /// <param name="colname">列名</param>
  /// <returns>如果值存在,返回;否则,返回System.Double.MinValue</returns>
  public static double ValidateDataRow_F(DataRow row,string colname)
  {
   if(row[colname]!=DBNull.Value)
    return Convert.ToDouble(row[colname]);
   else
    return System.Double.MinValue; 
  }

  /// <summary>
  /// 从一个DataRow中,安全得到列colname中的值:值为时间类型
  /// </summary>
  /// <param name="row">数据行对象</param>
  /// <param name="colname">列名</param>
  /// <returns>如果值存在,返回;否则,返回System.DateTime.MinValue;</returns>
  public static DateTime ValidateDataRow_T(DataRow row,string colname)
  {
   if(row[colname]!=DBNull.Value)
    return Convert.ToDateTime(row[colname]);
   else
    return System.DateTime.MinValue; 
  }

  #endregion DataRow
 }

------------------------------------------------

SQLString类

----------------------

//对传递过来的字符串进行处理的类
 public class SQLString
 {
  //公有静态方法,将SQL字符串里面的(')转换成('')
  public static String GetSafeSqlString(String XStr)
  {
   return XStr.Replace("'","''");
  }

  //公有静态方法,将SQL字符串里面的(')转换成(''),再在字符串的两边加上(')
  public static String GetQuotedString(String XStr)
  {
   return ("'" + GetSafeSqlString(XStr) + "'");
  }
 }

---------------------------------------------------------------

 

具体代码可到

http://download.csdn.net/source/2905188 下载

原创粉丝点击