一:我的问题:
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);
}
6、UI界面层代码
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()
请问对于这个问题,插入时该如何处理?对于没有赋值的字段 以及有默认值的字段该如何处理?
1.对非必要的字段设为可空,数据库设为可空,业务对象类值类型也用可空类型,int?,DateTime?,decimal?之类的.
2.可以把这些非必要的字段设计为另外的表和业务对象类,例如上面的叫UserInfo或者UserProperty,使用另外的方法去维护.
你说的意思 我当然明白,我就是说,目前的这个问题, 再插入时的异常如何处理?
另外public static bool UpdateEbUser(EbUser ebUser)
同样会出现这个问题,不会每次都修改所有的字段值呢?!
@WesternWind:
你目前的这个问题是什么问题啊?你说了一大段也没有明确说出什么问题..
@WesternWind:
好端端为什么会异常了?
在DAO加个判断,如果值为为空则不添加,可以不?
你的SQL的参数值也要处理,如果参数值为null,则赋 DBNull.Value
谢谢,你绝对给力。突然提醒了我,很准确,我抽取出来写了一个公共方法(附在后面)。
数据插入没有任何问题了,数据库里面设定的默认值也不受影响,搞定了 !
但是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;
}
}