using System;
using System.Data;namespace Models
{
/// <summary>
/// 用户类
/// </summary>
[Serializable]
public partial class Users
{
  public Users() { }
  public Users(int id, string userName, string userPassword, int? isAdmin, int? isLock)
{
  this.ID = id;
  this.UserName = userName;
  this.UserPassword = userPassword;
  this.IsAdmin = isAdmin;
  this.IsLock = isLock;
}
public Users(IDataReader reader)
{
  if (ModelHelper.HasColumn(reader, "ID"))
  {
    if (reader["ID"] != DBNull.Value)
    {
      this.ID = (int)reader["ID"];
    }
  }
  if (ModelHelper.HasColumn(reader, "UserName"))
  {
    if (reader["UserName"] != DBNull.Value)
    {
      this.UserName = (string)reader["UserName"];
  }
  }
  if (ModelHelper.HasColumn(reader, "UserPassword"))
  {
    if (reader["UserPassword"] != DBNull.Value)
    {
      this.UserPassword = (string)reader["UserPassword"];
    }
  }
  if (ModelHelper.HasColumn(reader, "IsAdmin"))
  {
    if (reader["IsAdmin"] != DBNull.Value)
    {
      this.IsAdmin = (int?)reader["IsAdmin"];
    }
  }
  if (ModelHelper.HasColumn(reader, "IsLock"))
  {
    if (reader["IsLock"] != DBNull.Value)
    {
      this.IsLock = (int?)reader["IsLock"];
    }
  }
}
public int? ID{get;set;}
/// <summary>
/// 用户名
/// </summary>
public string UserName{get;set;}
/// <summary>
/// 密码
/// </summary>
public string UserPassword{get;set;}
/// <summary>
/// 是否管理员 0否 1是
/// </summary>
public int? IsAdmin{get;set;}
/// <summary>
/// 是否启用 0否 1是
/// </summary>
public int? IsLock{get;set;}
  }
}C#

解决方案 »

  1.   

    “这样的过程是什么叫法”这个我很难命名,因为我可以说出此类设计的毛病和毛病出处,但是既然是毛病那么此类代码就一定是“照猫画虎结果完全画废了”的结果,反而无法为这种过程起名字了。对于实体类,它应该是一个干净的——贫血或者失学——的类型。也就是说或者根本没有代码,或者就算有代码也是纯粹算法计算的代码而跟什么DAL、UI之类的层次毫无关系。而你贴的这个代码,竟然输入了 IDataReader 类型参数,且不管它什么情况下会稍不小心就出现一堆“数据库连接池已满”造成程序崩溃的问题,就说这个设计原则上的问题,这个数据 model 模型纠结于 ADO.NET 了,就无法像普通的 model 一样把这段代码直接引用与其它层次上了。(所谓引用,你可以在vs上解决方案树其它工程上选择“添加->已有项”,然后选择这个工程的这个文件,然后在右下角的“添加”按钮旁边的小三角上点中并选择“添加为连接”,这样就可以把一个文件共享于多个工程)。另外在起名上,这个class问题就更严重了。它起了一个名字叫做 Users,而且是不过是单个对象。这有悖于生活语言的常理,生活中通常是缺少文化的人才这样分不清楚“xxxx”和“xxxx们”的概念的。这样起随便加个s后缀,写到程序里自然就会很乱。这个代码貌似是 model,其实是一些错误地理解了“三层”的人写的分不清楚DAL和model区别的代码。在BLL中你可以直接写            List<User> result;
                using (var conn = new OracleConnection(cnStr))
                {
                    conn.Open();
                    var comm = conn.CreateCommand();
                    comm.CommandText = "select e.id, e.name,e.ps,e.lck from Users as e where ..........";
                    comm.CommandType = System.Data.CommandType.Text;
                    result = ( from DbDataRecord record in comm.ExecuteReader()
                                let name = (string)record["TheName"]
                                select new User{ 
                                                Name = name,
                                                ID = (string)record["ID"],
                                                Password = (string) record["ps"],
                                                IsLock=(bool)record["lck"]
                                           };
                             ).ToList();
                }    
    这样的语句直截了当地使用 IDataReader 接口。但是Model层代码是贯穿UI、BLL、DAL的代码,它的设计应该是比较简单干净的,例如就是namespace Models
    {
    /// <summary>
    /// 用户类
    /// </summary>
    [Serializable]
    public partial class User
    {
      public int ID{get;set;}
      public string Name{get;set;}
      public string Password{get;set;}
      public bool IsAdmin{get;set;}
      public bool IsLock{get;set;}
    }而不应该依赖于 ADO.NET 这样的 DAL 类库。最后算是小语法了,不是什么大事。在数据库表设计中不要动不动就设置字段为允许null值。在这个前提下,少数确实是null值跟默认值有意义需要区分的字段,在读取时区分一下就行了,例如Password = record["ps"]==null? null: (string) record["ps"],
      

  2.   

    嗯,最后的代码手误了,应该写为Password = record["ps"]==DBNull.Value ? null: (string) record["ps"],
      

  3.   

    所谓三层,就是说UI不引用DAL,而是UI层引用BLL层,BLL层引用DAL层。这就是三层。而model是定义简单地给各层传送数据实体对象的,它被各层都同时共享,它的定义不能臃肿地依赖于DAL。
      

  4.   

    会不会是因为他用了OleDb数据库啊?