解决“数据为空。不能对空值调用此方法或属性。”

      这2天遇到了这个问题。百度了一下才知道是经典问题。答案是“因此建议作NULL处理”。于是在存储过程将DateTime默认为“null”,Nvarchar默认为‘ ’。但是这样子还是无读取DateTime字段.

      有建议按以下方法将DateTime读取出来:

ContractedBlock.gif ExpandedBlockStart.gif Code
ExpandedBlockStart.gifContractedBlock.gif /**//// <summary>
        
/// 判断是否为空
        
/// </summary>
        
/// <param name="param"></param>
        
/// <returns></returns>

        public static string GetValue(object param)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
if (param == null || param == DBNull.Value)
                
return " ";
            
else
                
return param.ToString();
        }

      读取:

   user.Brithday  =  StrHelper.GetValue(dr[ " Brithday " ]);

 

      但是这样子读出来的是String类型。在页面又要一堆处理。纠缠半天,决定还是使用DateTime类型的变量。
 于是改下刚才的方法:

ContractedBlock.gif ExpandedBlockStart.gif Code

ExpandedBlockStart.gifContractedBlock.gif        
/**//// <summary>
        
/// 当datetime为空时,返回"0001-01-01"
        
/// </summary>
        
/// <param name="param"></param>
        
/// <returns></returns>

        public static DateTime GetDateValue(object param)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
if (param == null || param == DBNull.Value)
                
return DateTime.Parse("0001-01-01");
            
else
                
return (DateTime)param;
        }

 
在页面的处理

ContractedBlock.gif ExpandedBlockStart.gif Code
 if (user.Brithday == DateTime.Parse("0001-01-01"))
        {
            txtBrithday.Text 
= "";
        }
        
else
        {
            txtBrithday.Text 
= StrHelper.FormartDateTime(user.Brithday);
        }


      这样暂时解决的我的问题,我知道这样子无法彻底解决问题。

      在《PopForums8.0》找到比较彻底解决的方法:
工具类:

ContractedBlock.gif ExpandedBlockStart.gif Code
ExpandedBlockStart.gifContractedBlock.gif        /**//// <summary>
        
/// Converts a null value to <see cref="DBNull"/>.
        
/// </summary>
        
/// <param name="value">The value to test for null.</param>
        
/// <returns><see cref="DBNull"/> if object is null; otherwise returns the object.</returns>

        public static object GetDBNUll(object value)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
return value ?? (object)DBNull.Value;
        }


        
public static int? NullIntDBHelper(SqlDataReader reader, int index)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
if (reader.IsDBNull(index)) return null;
            
return reader.GetInt32(index);
        }


        
public static DateTime? NullDateTimeDBHelper(SqlDataReader reader, int index)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
if (reader.IsDBNull(index)) return null;
            
return reader.GetDateTime(index);
        }


实体:

ContractedBlock.gif ExpandedBlockStart.gif Code
public class UserInfo
{
        
private DateTime? _birthday;

        
/// <summary>
        
/// 用户生日
         
/// </summary>
        public DateTime? Brithday
        {
            
get { return _birthday; }
            
set { _birthday = value; }
        }
}

 

数据层:

Select:

UserInfo user  =   new  UserInfo();
//
user.Brithday  =  SQLHelper.NullDateTimeDBHelper(dr,  3 );


update:

ContractedBlock.gif ExpandedBlockStart.gif Code
SqlParameter[] parms = {
                          
//
                         new SqlParameter("@Brithday",SqlDbType.DateTime),
                         
//
                        } 
//
parms[1].Value = SQLHelper.GetDBNUll(user.Brithday);

 

页面:

ContractedBlock.gif ExpandedBlockStart.gif Code
Code
protected void Page_Load(object sender, EventArgs e)
{
      
if (!IsPostBack)
        {
            txtBrithday.Text 
= (user.Brithday.HasValue) ? user.Brithday.Value.ToShortDateString() : "";
        }

}


protected void btnUpdate_Click(object sender, EventArgs e)
{
       
//生日内容
        DateTime brithday;
       
if (DateTime.TryParse(txtBrithday.Text.Trim(), out brithday))//尝试转换textbox的字符串为日期格式
            
//成功
            user.Brithday = brithday;
       
else//转换失败或内容为空
            user.Brithday = null;
}

 

转载于:https://www.cnblogs.com/WindWing/archive/2009/04/14/1435866.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值