惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
美团技术团队
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
A
About on SuperTechFans
Recent Announcements
Recent Announcements
D
Docker
Vercel News
Vercel News
Engineering at Meta
Engineering at Meta
腾讯CDC
Martin Fowler
Martin Fowler
阮一峰的网络日志
阮一峰的网络日志

博客园 - suny2006

关于xml的模糊查询问题 - suny2006 - 博客园 XmlDocument 操作xml文档 - suny2006 - 博客园 使用正则表达式 Eclipse3.2 中 Java Web(Jsp) 开发环境的搭建之 Lomboz+Tomcat 如何在asp.net中关闭B页面时,自动刷新A页面? - suny2006 - 博客园 Asp.Net防止刷新重复提交数据小记 Asp.Net防止刷新重复提交数据小记 如何使用变量给数据源控件参数赋值、如何动态增减数据源控件参数并支持分页 sql注入 下载www.youtube.com网站上视频的方法…… 使用 ADO.NET 访问 Oracle 9i 存储过程 ASP.NET调用oracle存储过程实现快速分页 关于一个网站实现简体和繁体的解决方案 vs2005比2003有什么本质性的变化?(转载) ASP.NET页面信息传递方法 试验通过就是牛 ---- 据说是世界编程大赛第一名写的程序 CODES 常用。NET相关网站 一步一步学习ObjectDataSource控件--自定义分页排序
从ASP.NET数据库某字段为空时的处理所衍生出来的思考
suny2006 · 2006-09-28 · via 博客园 - suny2006

对于数据库字段为空时,在b/s结构下的处理方式很多,而到了dotnet时代,就和原来有了本质的不同,根本就在于更强调服务器的自行处理。下面一步一步地从大家最熟悉的东西开始说。


首先用一个简单的asp+access留言本为例。数据库中对于每一个留言都有对应的一个回复,并且,只要回复了的留言将会用一个数据类型未bitmessagestatus字段来标记,回复了的用“1”来标记,否则用“0”(下面只给出关键部分代码,也就是判断messagestatus字段的值是真还是假):


<%

          if messagers("messagestatus")=false then

%>

     ................(此处省略了html代码)

     <%

              else  

              set replyrs = server.createobject("adodb.recordset")

              replysql = "select * from reply where messageid = " & messagers("messageid")

              replyrs.open replysql,conn

      %>

     ................(此处省略了html代码)

     <%

              replyrs.close

              set replyrs = nothing

              end if

%>

    而在asp.net中,由于程序代码已经完全可以和html代码分开,加上所提供的服务器端控件,使我们必须要找到一种适合于asp.net的方式。下面就直接进入我们的正题,和大家一起探讨在asp.net如何更好的实现。


    下面列出笔者所知道的三种方法。下面还以留言板为例。


第一种——

可以这样解决,在cs页里写一函数,用于判断一个帖子是否有回复,如果有回复,则返回回复的内容,没有则返回“无回复”。然后把这个方法绑定到datagrid或者datalist,或者reapter空间的itemtemplate中的一个label控件上。

下面是一个例子,用于显示某个图片,首先用isimageavailable()方法判断是否存在这幅图片,返回是一个布尔值,从而控制img控件和label控件是否显示.如果有图片,则img控件显示,否则显示label控件。


<asp:templatecolumn runat="server" headertext="photo">

              <itemtemplate>

                     <img runat="server" width="50" 

                            visible='<%#isimageavailable(databinder.eval(container.dataitem, "lastname").tostring()) %>'      

                            src='<%#"images\\" + databinder.eval(container.dataitem, "lastname") + ".bmp" %>' />

                     <asp:label runat="server" text="<i><small>没有图片可显示。</small></i>"

                            visible='<%#isimageavailable(databinder.eval(container.dataitem, "lastname").tostring()) %>' />

              </itemtemplate>         

           </asp:templatecolumn>


//isimageavailable()函数

private bool isimageavailable(string strlastname)

{

       string strimagefile = "images\\" + strlastname + ".bmp";

       return file.exists(server.mappath(strimagefile));

}

解决思路大概就是这样,当没有图片时用label控件显示"no picture available"


       第二种——

       留言板的数据显示使用datagrid控件,那么就容易了。使用datagrid控件显示数据的时候,如果字段值为null,它会自动默认为空。所以我们可以把数据存为一个dataset,然后再绑定到datagrid上,使用for 循环来判断,如果一个字段为空,如下赋值:


for (int i, i<ds.table[0].rows.count,i++)

{

if ds.table[0].row[i]["字段名"] = null

{

ds.table[0].row[i]["字段名"] = "未回复";

}

}


       第三种——

       直接只用sql语句。大家先来看看这样一个sql语句:


select guestname,guestcontact,guestemot,posttitle,postcontent,posttime,postip,case when(replycontent is null) then '未回复' else replycontent end as reply from guestbook order by id desc



    

这里出现了一个case when() then … else …end as,下面来看看它的具体用法。

case

计算条件列表并返回多个可能结果表达式之一。

case 具有两种格式:

1、简单 case 函数将某个表达式与一组简单表达式进行比较以确定结果。

2case 搜索函数计算一组布尔表达式以确定结果。

两种格式都支持可选的 else 参数。


语法

简单 case 函数:

case input_expression
    when when_expression then result_expression
        [ ...n ]
    [
        else else_result_expression
    end

case 搜索函数:

case
    when boolean_expression then result_expression
        [ ...n ]
    [
        else else_result_expression
    end


参数

input_expression

是使用简单 case 格式时所计算的表达式。input_expression 是任何有效的 microsoft® sql server™ 表达式。


when when_expression


使用简单 case 格式时 input_expression 所比较的简单表达式。when_expression 是任意有效的 sql server 表达式。input_expression 和每个 when_expression 的数据类型必须相同,或者是隐性转换。


n

占位符,表明可以使用多个 when when_expression then result_expression 子句或 when boolean_expression then result_expression 子句。


then result_expression

input_expression = when_expression 取值为 true,或者 boolean_expression 取值为 true 时返回的表达式。result expression 是任意有效的 sql server 表达式。

当比较运算取值不为 true 时返回的表达式。如果省略此参数并且比较运算取值不为 truecase 将返回 null 值。else_result_expression 是任意有效的 sql server 表达式。else_result_expression 和所有 result_expression 的数据类型必须相同,或者必须是隐性转换。


when boolean_expression

使用 case 搜索格式时所计算的布尔表达式。boolean_expression 是任意有效的布尔表达式。



结果类型

result_expressions 和可选 else_result_expression 的类型集合中返回最高的优先规则类型。



       那么,总结一下上面说过的三种方法:

1、  第一种方法,需要额外写一个处理函数。增加了工作量;

2、  利用了dotnet中的dataset,对于能熟练运用的朋友来说不成问题,但是对于初学者这个就有点困难了。而且也没有从减少代码量角度来考虑;

3、  充分利用了sql语句,将空字段的处理完全交给服务器来完成,不需要额外写任何的代码。


else else_result_expression