我的代码:

rptSeal.DataSource = dtrSeal
rptSeal.DataBind()                   // 我是用repeater绑定数据的。取值过程用 Container.DataItem("字段名")现在的问题是:我取出的值是一个代号,我要把代号转换成字符变量,于是我用函数完成,结果如下:Public Function Tran_Type(strType As String) As String    Select Case strType
    case "1"
           Return "这个"
    case "2"
           Return "那个"
    case "3"
          Return ....
    End Select
End Function////////////////////////////////////////////////////////////
但数据库中取出的数据可能为空,为空时就会出错,想问各位如何判断是否为空,及如何应用到程序中。我这样使用可是不行,如下:

If Convert.IsDBNull(strType) Then          //在函数中
.......or<%# Convert.IsDBNull(Container.DataItem("字段名")) ? "99" : Container.DataItem ) %>
// 也不行,这个可能是在VB。NET中没有 ?:这个运算符
请问各位,要完成这个问题该如何做呢,谢谢!

解决方案 »

  1.   

    Public Function Tran_Type(strType As String) As String    Select Case strType
        case "1"
               Return "这个"
        case "2"
               Return "那个"
        case "3"
              Return ....
        default
              Return ....
        End Select
    End Function
      

  2.   

    C#的语法  VB没有写过
        default
              Return ....
      

  3.   

    select case isnull(strType,'0') when '1' then '这个' when '2' then '那个' else '' end  as type1 from tb1
      

  4.   

    你说的那个在vb.net中是IIF,你可以看一下SDK.
      

  5.   

    你的数据集是什么?如果是datareader,那么,你必须在SQL语句中排除null值的存在,比如
    select iif(xx=null,-1) from table
    否则,当有NULL值的时候,以datareader取值绑定的时候,就会出错,跟你的函数没有关系
    如果是用dataset,那么,可把你的函数改如下:
    Public Function Tran_Type(strType As String) As String    Select Case strType
        case "1"
               Return "这个"
        case "2"
               Return "那个"
        case "3"
              Return ....
        case else
              Return...
        End Select
    End Function
      

  6.   

    你用iif也不行的,你这里出现错误的原因不是你的isDbNull的错误,而是你在函数的开始已经隐式讲数据转换为了string类型,当然会报错了Public Function Tran_Type( ByVal row As System.Data.DataRowView) As String
    if isDbNull(row("字段名")) then
      return ""
    end if    Select Case row("字段名")
        case "1"
               Return "这个"
        case "2"
               Return "那个"
        case "3"
              Return ....
        End Select
    End Function调用
    <%# Tran_Type(Container.DataItem) %>
      

  7.   

    如果你用iif也是会出问题,原因是如果数据为null也会报错,因为用条件运算符编译器会先计算出结果
      

  8.   

    http://blog.csdn.net/downmoon/archive/2005/07/08/417526.aspx
    http://downmoon.mblogger.cn/posts/16620.aspx
      

  9.   

    我感觉 mathsword说的应该是可以。我的想法也是通过这样的方法来解决问题,不过,我对System.Data.DataRowView这个东西不太了解,在我按上面程序执行时,会出现这样的错误,不知是什么原因:
    Server Error in '/' Application.
    --------------------------------------------------------------------------------Specified cast is not valid. 
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.InvalidCastException: Specified cast is not valid.Source Error: 
    。我的程序的数据程序是这样写的:Dim conSeal As SqlConnection
    Dim cmdSeal As SqlCommand
    Dim dtrSeal As SqlDataReader
    Dim strSQL  As String  ="SELECT * FROM 表"conSeal = New SqlConnection( 连接字符串 )
    cmdSeal = New SqlCommand(strSQL,conSeal)
    conSeal.Open()
    dtrSeal = cmdSeal.ExectueReader()rptSeal.DataSource = dtrSeal
    rptSeal.DataBind()
    ...........我写的函数基本和上一样:
    Public Function Tran_Materia(ByVal row As System.Data.DataRowView) As String
       If IsDBNull(row("字段名")) Then
           Retrun "无信息"
       Else
           Select Case row("字段名")
               Case "01"
                   Return "一"
               Case "02"
                   Return "二"
               Case "03"
                   Return ............
           End Select
       End If
    End Function
    ///////////////////////调用: <%# Tran_Materian(Container.DataItem) %>
    麻烦各位了,谢谢!
      

  10.   

    以上已经说了:哈哈!老兄:可以在sql语句先排除,也可以,在你写的那个function重加一个else
    return  "狗屎东西什么都没有"
    哈哈,对撒!
      

  11.   

    好像是因为,在repeater中没有datarow这个类,但我原来程序是用repeater写成的,该 这么办呢,这下。??????
      

  12.   

    根本不行,在语句中加什么,我是没写而以,问题出在不是结果,而是在绑定后如果字段值为空就出错了(看以上Math说的,那里有一个强制类型转换),不是没有返回。在SQL中加空控制基本不可能,里面有上百项字段,我要是一个一个控制一下那可够我受的了,再加上,我必须返回所有的值,这个表是比较复杂的,所以如果能针对字段取出加上函数控制才是上选。我大概看了一下system.data.dataview,我想出错的原因在于,我的repeater控件没有实现和dataview的绑定,所以row没有意义,但不知道,如何可以把repeater和dataview联系起来。
      

  13.   

    回复顶楼:
    你的问在于不是没有Row,可能是没有记录!
    你可以在取出 dtrSeal 后判断一下:
    if(dtrSeal.Count==0)
    {return ;}sql里也可以处理一下
    isnull(id,0) as id,isnull(name,'default') as name ^^^^^^^^
      

  14.   

    问题出在不是结果,而是在绑定后如果字段值为空就出错了(看以上Math说的,那里有一个强制类型转换),
    ------------
    把你的数据集改为dataset或datatable,就不会出错了.
    请再看一下我上面的描述.
      

  15.   

    如果是datareader 的话可以用reader.IsDBNull()来判断是否为空,参数是字段的列数
    row["Title"]=reader.IsDBNull(1)?"":reader.GetString(1);应该可以的吧!我一直这样用的
      

  16.   

    Public Function Tran_Materia(ByVal row As System.Data.DataRowView) As String
     Dim localRow As DataRow = row.Row()   If IsDBNull(localRow ("字段名")) Then
           Retrun "无信息"
       Else
           Select Case localRow ("字段名")
               Case "01"
                   Return "一"
               Case "02"
                   Return "二"
               Case "03"
                   Return ............
           End Select
       End If
    End Function
      

  17.   

    把view 先转换成row,不好意思漏掉了
      

  18.   

    搞定了,果然如我所想,是因为我没有用DataView类的原因。只要在数据打开时用这种DataView方式就OK了,非常感谢各位。