C#调用数据库时的DBNull问题

BestAns1 2009-04-26 03:52:01
Mdb数据库Users表结构:
ID 自动编号
Name 姓名,字符串,不可为空
Age 年龄,数字,可为空

现在要写一个“获取年龄为xx的用户”的函数,在DataSet中写入如下查询:
SELECT * FROM Users WHERE Age=?
自动生成了函数:
GetDataByAge(int? Age);

获取年龄为10的用户,就用:
xx = GetDataByAge(10);

获取年龄未知的用户,就用:
xx = GetDataByAge(null); // 这里出错,无法找到任何记录

但是现在问题来了,"WHERE Age=NULL"无法匹配任何记录,因为正规的写法是"WHERE Age IS NULL"
当然,我可以将年龄未知用"-1"表示。但是,现在数据库设计不能修改,年龄未知必须用null表示。

那我该怎么做才能实现“获取年龄未知的用户”呢?

谢谢!
...全文
169 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
BestAns1 2009-05-11
  • 打赏
  • 举报
回复
结贴了,只是还没有合适的办法。
BestAns1 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 m777 的回复:]
引用 4 楼 wumingcn 的回复:
引用 1 楼 m777 的回复:
建议再窗体弄一个复选框,选中了复选框就显示jc=1
然后SQL这样写:
 
SELECT * FROM Users WHERE (Age=xx and {jc}!=1) or (age is null and {jc}=1)
 
{jc}用你窗体或者传入的是否要显示空年龄的标识来替换!



我在写数据访问层,因此不适合加入额外的条件。谢谢!


你题目都说了【那我该怎么做才能实现“获取年龄未知的用户”呢? 】…
[/Quote]

谢谢您的指教。只可惜数据访问层不能这么做。
快40的码农 2009-04-26
  • 打赏
  • 举报
回复
sql中用SELECT * FROM Users WHERE 1=1.
然后在参数中用string型的."and Age=xx"
m777 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wumingcn 的回复:]
引用 1 楼 m777 的回复:
建议再窗体弄一个复选框,选中了复选框就显示jc=1
然后SQL这样写:

SELECT * FROM Users WHERE (Age=xx and {jc}!=1) or (age is null and {jc}=1)

{jc}用你窗体或者传入的是否要显示空年龄的标识来替换!



我在写数据访问层,因此不适合加入额外的条件。谢谢!
[/Quote]

你题目都说了【那我该怎么做才能实现“获取年龄未知的用户”呢? 】,这就说明你选择位置年龄用户,说明肯定有这个标识,我觉得你还是应该多想想表达方式!
BestAns1 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Garnett_KG 的回复:]
那就麻烦点在GetDataByAge(int? Age)中判断Age是否为null然后再写不同的sql语句了。

[/Quote]

都是用的DataSet自动生成的代码,如果这里单独写一段,会感觉有些乱。
Garnett_KG 2009-04-26
  • 打赏
  • 举报
回复
那就麻烦点在GetDataByAge(int? Age)中判断Age是否为null然后再写不同的sql语句了。
BestAns1 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 m777 的回复:]
建议再窗体弄一个复选框,选中了复选框就显示jc=1
然后SQL这样写:

SELECT * FROM Users WHERE (Age=xx and {jc}!=1) or (age is null and {jc}=1)

{jc}用你窗体或者传入的是否要显示空年龄的标识来替换!

[/Quote]

我在写数据访问层,因此不适合加入额外的条件。谢谢!
BestAns1 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Garnett_KG 的回复:]
SQL code
--
SELECT * FROM Users WHERE IIf(IsNull([Age]),-1,[Age])=?

[/Quote]

谢谢!

但是这样还有个问题,以前用[Age]=?的时候,DataSet可以自动识别参数为int类型并生成相应代码。
如果按照您的SQL语句,那么DataSet无法识别参数类型,会用string Param1来代替原来的int Age参数。这样一来,似乎也很不妥。
Garnett_KG 2009-04-26
  • 打赏
  • 举报
回复

--
SELECT * FROM Users WHERE IIf(IsNull([Age]),-1,[Age])=?


m777 2009-04-26
  • 打赏
  • 举报
回复
建议再窗体弄一个复选框,选中了复选框就显示jc=1
然后SQL这样写:

SELECT * FROM Users WHERE (Age=xx and {jc}!=1) or (age is null and {jc}=1)

{jc}用你窗体或者传入的是否要显示空年龄的标识来替换!

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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