读取空值的问题

Cool_xiaocao 2011-01-26 12:53:43

/// <summary>
/// 根据ID得用户表实体
/// </summary>
/// <param name="Id">主键ID</param>
/// <returns>实体</returns>
public static UserInfo GetUserInfoEntity(int Id)
{
string strSql = "select * from UserInfo where userId = " + Id;
SqlDataReader reader = SqlHelper.GetDataReader(strSql);
if (reader.Read())
{
UserInfo user = new UserInfo();
user.UserId = int.Parse(reader["userId"]);
user.UserName = reader["userName"].ToString();
user.UserTime = (DateTime?)reader["userTime"];
return user;
}
else
{
reader.Close();
return null;
}
}

UserInfo实体表
public class UserInfo
{
private int _userId;
/// <summary>
/// 主键ID
/// </summary>
public int UserId
{
get { return _userId; }
set { _userId = value; }
}
private string _userName;
/// <summary>
/// 用户名
/// </summary>
public string UserName
{
get { return _userName; }
set { _userName = value; }
}
private Nullable<DateTime> userTime;
/// <summary>
/// 用户注册时间
/// </summary>
public Nullable<DateTime>UserTime
{
get { return _userName; }
set { _userName = value; }
}
}


数据表(UserInfo)
userId userName userTime
1 csdn NULL
2 csdn NULL

通过ID获取到UserInfo表中的数据,但reader.Read()的时候出现“指定的转换无效”

我知道问题是出现在user.UserTime = (DateTime?)reader["userTime"];
我是想把reader["userTime"]的值赋给user.UserTIme,应该怎么解决呢?
这里数据类型转换出现错误,当读取数据库中空(NULL)字段,相应的Nullable<T>空类型应怎么赋值?
请大家帮忙解决解决。
...全文
214 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
cykb518 2011-01-26
  • 打赏
  • 举报
回复
user.UserTime=Convert.ToDateTime(DBNull.Value==reader["userTime"]?"1900-01-01":reader["userTime"]);

\
yujiayou 2011-01-26
  • 打赏
  • 举报
回复
string.IsNullOrEmpty(Text)?"0":convert.Int32(Text)
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cool_xiaocao 的回复:]

最后还是解决到了,参考上述各位的方法的

应该是这样的
C# code

user.UserTime = reader["userTime"] == DBNull.Value ? DateTime.MinValue : (DateTime)reader["userTime"];
[/Quote]

呵呵,这里就有另外一个问题了。你为什么会定义属性类型为DateTime?类型?一般我们看到这个定义就知道,不能赋值DateTime.MinValue,而应该赋值null。
Cool_xiaocao 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sp1234 的回复:]

引用 10 楼 cool_xiaocao 的回复:
既然 Nullable<T> 是可空类型 那为什么空的reader["userTime"]赋给 user.UserTime会出错呢


Nullable<T>跟你说的数据库中的NULL是两回事,不要搞混。

参见:http://www.google.com.hk/search?q=.net+dbnull&hl=zh-CN&a……
[/Quote]

看了,明白很多了,非常感谢。
  • 打赏
  • 举报
回复
由于DBDataReader中返回某一列的数据的是装箱之后的object类型,所以你取到的reader["userTime"]结果既可能是一个DataTime类型的对象,也可能是一个DBNull类型的对象,说不定的。所以,你需要先判断,然后才为user.UserTime赋值,reader["userTime"]不是DateTime时要做额外处理。
Cool_xiaocao 2011-01-26
  • 打赏
  • 举报
回复
最后还是解决到了,参考上述各位的方法的

应该是这样的

user.UserTime = reader["userTime"] == DBNull.Value ? DateTime.MinValue : (DateTime)reader["userTime"];

  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cool_xiaocao 的回复:]
既然 Nullable<T> 是可空类型 那为什么空的reader["userTime"]赋给 user.UserTime会出错呢
[/Quote]

Nullable<T>跟你说的数据库中的NULL是两回事,不要搞混。

参见:http://www.google.com.hk/search?q=.net+dbnull&hl=zh-CN&safe=strict&prmd=ivns&source=lnt&tbs=lr:lang_1zh-CN|lang_1zh-TW&lr=lang_zh-CN|lang_zh-TW&sa=X&ei=eJw_TZjFIYGycZybvLsC&ved=0CAcQpwUoAQ
回头是岸 2011-01-26
  • 打赏
  • 举报
回复
user.UserTime = reader["userTime"] is DBNull?DateTime.MinValue:(DateTime)reader["userTime"];
Cool_xiaocao 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q107770540 的回复:]

user.UserTime = reader["userTime"]==null?DateTime.MinValue:(DateTime)reader["userTime"];
[/Quote]

同样出现"指定的转换无效"
Cool_xiaocao 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wxr0323 的回复:]

Nullable<T> 返回的是结构体啊

可以返回new Nullable<T>().Value啊

(DateTime?)reader["userTime"]==null?DateTime.Now:(DateTime?)reader["userTime"];

这样如何?
[/Quote]

既然 Nullable<T> 是可空类型 那为什么空的reader["userTime"]赋给 user.UserTime会出错呢
chen_ya_ping 2011-01-26
  • 打赏
  • 举报
回复
private Nullable<DateTime> userTime;
直接的就修改为datatime? userTime;
telankes2000 2011-01-26
  • 打赏
  • 举报
回复
试试
user.UserTime = (DateTime?)reader["userTime"];====>
user.UserTime = reader.GetDateTime(2)//假如你的字段顺序为3
天下在我心 2011-01-26
  • 打赏
  • 举报
回复
用三元运算符,取出来的数据不为null才转换
R_zhanche 2011-01-26
  • 打赏
  • 举报
回复
(DateTime?) 你是用的代码生成器吧 这个没有问号的 把问号去掉
new_fengzi 2011-01-26
  • 打赏
  • 举报
回复
将时间类型设置为可空值类型
psysic0824 2011-01-26
  • 打赏
  • 举报
回复
DateTime?
q107770540 2011-01-26
  • 打赏
  • 举报
回复
user.UserTime = reader["userTime"]==null?DateTime.MinValue:(DateTime)reader["userTime"];
子夜__ 2011-01-26
  • 打赏
  • 举报
回复
Nullable<T> 返回的是结构体啊

可以返回new Nullable<T>().Value啊

(DateTime?)reader["userTime"]==null?DateTime.Now:(DateTime?)reader["userTime"];

这样如何?

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧