首页 新闻 会员 周边 捐助

业务对象 插入 和 更新 数据库时,业务对象的空值 以及对于数据库字段默认值 处理问题?

0
悬赏园豆:30 [已解决问题] 解决于 2017-09-28 15:51

一:我的问题:

     UI执行插入 和  更新 时      只对EbUser user = new EbUser();的部分字段赋值,而参数是整个user.

        对于没有赋值的字段

        可能是在日后的用户信息完善中由用户自己维护

        也可能是数据库本身设定有默认值 例如dateCreated字段在定义的时候有默认值getdate()  

 

        请问对于这个问题,插入时该如何处理?对于没有赋值的字段 以及有默认值的字段该如何处理?

二、解决方案基本情况如下:

1、表结构

CREATE TABLE EbUser(

   userId   int IDENTITY(1,1) NOT NULL Primary Key, */

    userName nvarchar(50) NULL,

nickName nvarchar(50) NULL,

userImg   nvarchar(50) NULL, 

    phone    nvarchar(50) NULL,

    mobile    nvarchar(50) NULL,

    IdCard   nvarchar(50) NULL, 

    email    varchar(50) NULL,

     qq        varchar(50) NULL,

    city    nvarchar(50) NULL,

    addr     nvarchar(50) NULL,

    postCode      varchar(50) NULL,       

    userPwd     varchar(50) NULL,          

    dateCreated    date NULL DEFAULT (getdate())   ,

    roleId          Int     null,

    levelId     Int    null,        

    memo            NVarchar(200)  null

)

2、业务对象类

    public class EbUser
    {
        public int   userId   {get;set;}
        public string   userName   {get;set;}
        public string   nickName   {get;set;}
        public string   userPwd   {get;set;}
        public string   phone   {get;set;}
        public string   mobile   {get;set;}
        public string   IdCard   {get;set;}
        public string   email   {get;set;}
        public string   qq   {get;set;}
        public string   city   {get;set;}
        public string   addr   {get;set;}
        public string   postCode   {get;set;}
        public DateTime   dateCreated   {get;set;}
        public int   roleId   {get;set;}
        public int   levelId   {get;set;}
        public string   memo   {get;set;}
    }

3、数据访问层Dao

/// <summary>
  /// 添加dbo.EbUser
  /// </summary>
  /// <param name="ebUser">dbo.EbUser</param>
  /// <returns>最新编号</returns>       
  public static int AddEbUser(EbUser ebUser)
  {
   string sql = "INSERT INTO EbUser(userName,nickName,userPwd,phone,mobile,IdCard,email,qq,city,addr,postCode,dateCreated,roleId,levelId,memo)" +
    " values(@userName,@nickName,@userPwd,@phone,@mobile,@IdCard,@email,@qq,@city,@addr,@postCode,@dateCreated,@roleId,@levelId,@memo);" +
    " SELECT SCOPE_IDENTITY();";
   
   try
            {
                SqlParameter[] paras = new SqlParameter[]
    {
     new SqlParameter("@userName",SqlDbType.NVarChar,50),
     new SqlParameter("@nickName",SqlDbType.NVarChar,50),
     new SqlParameter("@userPwd",SqlDbType.VarChar,50),
     new SqlParameter("@phone",SqlDbType.NVarChar,50),
     new SqlParameter("@mobile",SqlDbType.NVarChar,50),
     new SqlParameter("@IdCard",SqlDbType.NVarChar,50),
     new SqlParameter("@email",SqlDbType.VarChar,50),
     new SqlParameter("@qq",SqlDbType.VarChar,50),
     new SqlParameter("@city",SqlDbType.NVarChar,50),
     new SqlParameter("@addr",SqlDbType.NVarChar,50),
     new SqlParameter("@postCode",SqlDbType.VarChar,50),
     new SqlParameter("@dateCreated",SqlDbType.DateTime,8),
     new SqlParameter("@roleId",SqlDbType.Int,4),
     new SqlParameter("@levelId",SqlDbType.Int,4),
     new SqlParameter("@memo",SqlDbType.NVarChar,200)
    };
   int i=0;
           paras[i++].Value = ebUser.userName;
           paras[i++].Value = ebUser.nickName;
           paras[i++].Value = ebUser.userPwd;
           paras[i++].Value = ebUser.phone;
           paras[i++].Value = ebUser.mobile;
           paras[i++].Value = ebUser.IdCard;
           paras[i++].Value = ebUser.email;
           paras[i++].Value = ebUser.qq;
           paras[i++].Value = ebUser.city;
           paras[i++].Value = ebUser.addr;
           paras[i++].Value = ebUser.postCode;
           paras[i++].Value = ebUser.dateCreated;
           paras[i++].Value = ebUser.roleId;
           paras[i++].Value = ebUser.levelId;
           paras[i++].Value = ebUser.memo;
      return Convert.ToInt32(SqlHelper.ExecuteCommand(sql, paras));
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw e;
            }
  }

4、业务逻辑层BLL

   public static int AddEbUser(EbUser ebUser)
        {
            return EbUserService.AddEbUser(ebUser);
        }

6UI界面层代码

protected void Regist_Click(object sender, EventArgs e)

        {

            EbUser user = new EbUser();

 

            user.userName = UserName.Text.ToString().Trim();

            user.userPwd = Wangzhl.DecryptString(UserName.Text.ToString().Trim());

                       

            user.city = GetClientInfo.GetCityByIp(GetClientInfo.GetIp());

           EbUserManager.AddEbUser(user)

        }

7、我的问题

       UI执行插入时      只对EbUser user = new EbUser();的部分字段赋值,而参数是整个user.

        对于没有赋值的字段

        可能是在日后的用户信息完善中由用户自己维护

        也可能是数据库本身设定有默认值 例如dateCreated字段在定义的时候有默认值getdate()  

 

        请问对于这个问题,插入时该如何处理?对于没有赋值的字段 以及有默认值的字段该如何处理?

WesternWind的主页 WesternWind | 初学一级 | 园豆:7
提问于:2012-08-14 14:33
< >
分享
最佳答案
0

1.对非必要的字段设为可空,数据库设为可空,业务对象类值类型也用可空类型,int?,DateTime?,decimal?之类的.

2.可以把这些非必要的字段设计为另外的表和业务对象类,例如上面的叫UserInfo或者UserProperty,使用另外的方法去维护.

收获园豆:30
zhangweiwen | 小虾三级 |园豆:904 | 2012-08-14 14:48

你说的意思 我当然明白,我就是说,目前的这个问题, 再插入时的异常如何处理?

另外public static bool UpdateEbUser(EbUser ebUser)

同样会出现这个问题,不会每次都修改所有的字段值呢?!

WesternWind | 园豆:7 (初学一级) | 2012-08-14 14:59

@WesternWind: 

目前的这个问题是什么问题啊?你说了一大段也没有明确说出什么问题..

zhangweiwen | 园豆:904 (小虾三级) | 2012-08-14 15:19

@WesternWind: 

好端端为什么会异常了?

zhangweiwen | 园豆:904 (小虾三级) | 2012-08-14 15:19
其他回答(2)
0

在DAO加个判断,如果值为为空则不添加,可以不?

八戒的师傅 | 园豆:1472 (小虾三级) | 2012-08-14 20:50
0

你的SQL的参数值也要处理,如果参数值为null,则赋 DBNull.Value

geass.. | 园豆:1821 (小虾三级) | 2012-08-15 09:25

      谢谢,你绝对给力。突然提醒了我,很准确,我抽取出来写了一个公共方法(附在后面)。

      数据插入没有任何问题了,数据库里面设定的默认值也不受影响,搞定了 !

     但是Update该如何处理呢,因为不可能每次更新每条记录的所有字段。

 /// <summary>
        /// 业务对象填充实体对象公共方法
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private static SqlParameter[]   FillEbUserSqlParameter(EbUser ebUser)
        {
           try
            {
                SqlParameter[] paras = new SqlParameter[]
    {
     new SqlParameter("@userName",SqlDbType.NVarChar,50),
     new SqlParameter("@nickName",SqlDbType.NVarChar,50),
     new SqlParameter("@userPwd",SqlDbType.VarChar,50),
     new SqlParameter("@phone",SqlDbType.NVarChar,50),
     new SqlParameter("@mobile",SqlDbType.NVarChar,50),
     new SqlParameter("@IdCard",SqlDbType.NVarChar,50),
     new SqlParameter("@email",SqlDbType.VarChar,50),
     new SqlParameter("@qq",SqlDbType.VarChar,50),
     new SqlParameter("@city",SqlDbType.NVarChar,50),
     new SqlParameter("@addr",SqlDbType.NVarChar,50),
     new SqlParameter("@postCode",SqlDbType.VarChar,50),
     new SqlParameter("@dateCreated",SqlDbType.DateTime,8),
     new SqlParameter("@roleId",SqlDbType.Int,4),
     new SqlParameter("@levelId",SqlDbType.Int,4),
     new SqlParameter("@memo",SqlDbType.NVarChar,200)
    };
               
                int i=0;
                if(ebUser.userName==null)               
                   ebUser.userName=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.userName;
               
                if(ebUser.nickName==null)               
                   ebUser.nickName=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.nickName;
               
                if(ebUser.userPwd==null)               
                   ebUser.userPwd=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.userPwd;
               
                if(ebUser.phone==null)               
                   ebUser.phone=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.phone;
               
                if(ebUser.mobile==null)               
                   ebUser.mobile=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.mobile;
               
                if(ebUser.IdCard==null)               
                   ebUser.IdCard=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.IdCard;
               
                if(ebUser.email==null)               
                   ebUser.email=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.email;
               
                if(ebUser.qq==null)               
                   ebUser.qq=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.qq;
               
                if(ebUser.city==null)               
                   ebUser.city=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.city;
               
                if(ebUser.addr==null)               
                   ebUser.addr=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.addr;
               
                if(ebUser.postCode==null)               
                   ebUser.postCode=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.postCode;
               
                if(ebUser.dateCreated==null)               
                   ebUser.dateCreated=Convert.ToDateTime(DBNull.Value);   
                paras[i++].Value = ebUser.dateCreated;
               
                if(ebUser.roleId==null)               
                   ebUser.roleId=Convert.ToInt(DBNull.Value);   
                paras[i++].Value = ebUser.roleId;
               
                if(ebUser.levelId==null)               
                   ebUser.levelId=Convert.ToInt(DBNull.Value);   
                paras[i++].Value = ebUser.levelId;
               
                if(ebUser.memo==null)               
                   ebUser.memo=Convert.ToString(DBNull.Value);   
                paras[i++].Value = ebUser.memo;
               
                return paras;
               
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw e;
            }           
        }

支持(0) 反对(0) WesternWind | 园豆:7 (初学一级) | 2012-08-15 14:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册