如题.
在做项目过程中,有一部分数据类型的字段.
用户要求,不输入情况下为null,并不是0
我该如何处理?
项目中多处用到,有没有简单的方法,可以搞定.否则需要修改整个工程.

解决方案 »

  1.   

    if TextBox1.text = ""
    {
       数据字段 = null;
    }
    else
    {
       
       数据字段 = TextBox1.text; 
    }
      

  2.   

    保存的时候做一个判断,如果为空就给一个DBNull.Value
      

  3.   

    将数据库中的字段改为允许空 ,默认值为空把所有有默认值的方法中的Parameter.Add中的值0改为System.DBNull.Value
      

  4.   

    输入的时候肯定是字符串啊
    不输入,字符串就是""也就是String.Empty;比如,数量这个字段,从界面读入的时候,如果什么都没有输入,就是
    string strCount = "";
    在填充你的数据库适配器的时候把""转化为null就行了。
      

  5.   

    呵呵,我以前的一个项目在接近尾声时,客户也有这样的要求,可我不想大改程序了,我就在前台显示的程序里处理了一下,如果输出为'0'、'XXX.00'的数据就显示为''、'XXX'。
      

  6.   

    Imports System.DataNamespace Data  Public Class SafeDataReader    Implements IDataReader    Private mDataReader As IDataReader    Public Sub New(ByVal DataReader As IDataReader)
          mDataReader = DataReader
        End Sub    Public Function GetString(ByVal i As Integer) As String Implements IDataReader.GetString
          If mDataReader.IsDBNull(i) Then
            Return ""
          Else
            Return mDataReader.GetString(i)
          End If
        End Function    Public Function GetValue(ByVal i As Integer) As Object Implements IDataReader.GetValue
          If mDataReader.IsDBNull(i) Then
            Return Nothing
          Else
            Return mDataReader.GetValue(i)
          End If
        End Function    Public Function GetInt32(ByVal i As Integer) As Integer Implements IDataReader.GetInt32
          If mDataReader.IsDBNull(i) Then
            Return 0
          Else
            Return mDataReader.GetInt32(i)
          End If
        End Function    Public Function GetDouble(ByVal i As Integer) As Double Implements IDataReader.GetDouble
          If mDataReader.IsDBNull(i) Then
            Return 0
          Else
            Return mDataReader.GetDouble(i)
          End If
        End Function    Public Function GetSmartDate(ByVal i As Integer, Optional ByVal MinIsEmpty As Boolean = True) As SmartDate
          If mDataReader.IsDBNull(i) Then
            Return New SmartDate(MinIsEmpty)      Else
            Return New SmartDate(mDataReader.GetDateTime(i), MinIsEmpty)
          End If
        End Function    Public Function GetGuid(ByVal i As Integer) As Guid Implements IDataReader.GetGuid
          If mDataReader.IsDBNull(i) Then
            Return Guid.Empty
          Else
            Return mDataReader.GetGuid(i)
          End If
        End Function    Public Function Read() As Boolean Implements IDataReader.Read
          Return mDataReader.Read
        End Function    Public Function NextResult() As Boolean Implements IDataReader.NextResult
          Return mDataReader.NextResult()
        End Function    Public Sub Close() Implements IDataReader.Close
          mDataReader.Close()
        End Sub    Public ReadOnly Property Depth() As Integer Implements System.Data.IDataReader.Depth
          Get
            Return mDataReader.Depth
          End Get
        End Property    Public Sub Dispose() Implements System.IDisposable.Dispose
          mDataReader.Dispose()
        End Sub    Public ReadOnly Property FieldCount() As Integer Implements System.Data.IDataRecord.FieldCount
          Get
            Return mDataReader.FieldCount
          End Get
        End Property    Public Function GetBoolean(ByVal i As Integer) As Boolean Implements System.Data.IDataRecord.GetBoolean
          If mDataReader.IsDBNull(i) Then
            Return False
          Else
            Return mDataReader.GetBoolean(i)
          End If
        End Function    Public Function GetByte(ByVal i As Integer) As Byte Implements System.Data.IDataRecord.GetByte
          If mDataReader.IsDBNull(i) Then
            Return 0
          Else
            Return mDataReader.GetByte(i)
          End If
        End Function    Public Function GetBytes(ByVal i As Integer, ByVal fieldOffset As Long, ByVal buffer() As Byte, ByVal bufferoffset As Integer, ByVal length As Integer) As Long Implements System.Data.IDataRecord.GetBytes
          If mDataReader.IsDBNull(i) Then
            Return 0
          Else
            Return mDataReader.GetBytes(i, fieldOffset, buffer, bufferoffset, length)
          End If
        End Function    Public Function GetChar(ByVal i As Integer) As Char Implements System.Data.IDataRecord.GetChar
          If mDataReader.IsDBNull(i) Then
            Return Char.MinValue
          Else
            Return mDataReader.GetChar(i)
          End If
        End Function    Public Function GetChars(ByVal i As Integer, ByVal fieldoffset As Long, ByVal buffer() As Char, ByVal bufferoffset As Integer, ByVal length As Integer) As Long Implements System.Data.IDataRecord.GetChars
          If mDataReader.IsDBNull(i) Then
            Return 0
          Else
            Return mDataReader.GetChars(i, fieldoffset, buffer, bufferoffset, length)
          End If
        End Function    Public Function GetData(ByVal i As Integer) As System.Data.IDataReader Implements System.Data.IDataRecord.GetData
          Return mDataReader.GetData(i)
        End Function    Public Function GetDataTypeName(ByVal i As Integer) As String Implements System.Data.IDataRecord.GetDataTypeName
          Return mDataReader.GetDataTypeName(i)
        End Function    Public Function GetDateTime(ByVal i As Integer) As Date Implements System.Data.IDataRecord.GetDateTime
          If mDataReader.IsDBNull(i) Then
            Return Date.MinValue
          Else
            Return mDataReader.GetDateTime(i)
          End If
        End Function    Public Function GetDecimal(ByVal i As Integer) As Decimal Implements System.Data.IDataRecord.GetDecimal
          If mDataReader.IsDBNull(i) Then
            Return 0
          Else
            Return mDataReader.GetDecimal(i)
          End If
        End Function    Public Function GetFieldType(ByVal i As Integer) As System.Type Implements System.Data.IDataRecord.GetFieldType
          Return mDataReader.GetFieldType(i)
        End Function    Public Function GetFloat(ByVal i As Integer) As Single Implements System.Data.IDataRecord.GetFloat
          If mDataReader.IsDBNull(i) Then
            Return 0
          Else
            Return mDataReader.GetFloat(i)
          End If
        End Function    Public Function GetInt16(ByVal i As Integer) As Short Implements System.Data.IDataRecord.GetInt16
          If mDataReader.IsDBNull(i) Then
            Return 0
          Else
            Return mDataReader.GetInt16(i)
          End If
        End Function    Public Function GetInt64(ByVal i As Integer) As Long Implements System.Data.IDataRecord.GetInt64
          If mDataReader.IsDBNull(i) Then
            Return 0
          Else
            Return mDataReader.GetInt64(i)
          End If
        End Function    Public Function GetName(ByVal i As Integer) As String Implements System.Data.IDataRecord.GetName
          Return mDataReader.GetName(i)
        End Function    Public Function GetOrdinal(ByVal name As String) As Integer Implements System.Data.IDataRecord.GetOrdinal
          Return mDataReader.GetOrdinal(name)
        End Function    Public Function GetSchemaTable() As System.Data.DataTable Implements System.Data.IDataReader.GetSchemaTable
          Return mDataReader.GetSchemaTable
        End Function    Public Function GetValues(ByVal values() As Object) As Integer Implements System.Data.IDataRecord.GetValues
          Return mDataReader.GetValues(values)
        End Function    Public ReadOnly Property IsClosed() As Boolean Implements System.Data.IDataReader.IsClosed
          Get
            Return mDataReader.IsClosed
          End Get
        End Property    Public Function IsDBNull(ByVal i As Integer) As Boolean Implements System.Data.IDataRecord.IsDBNull
          Return mDataReader.IsDBNull(i)
        End Function    Default Public Overloads ReadOnly Property Item(ByVal i As Integer) As Object Implements System.Data.IDataRecord.Item
          Get
            If mDataReader.IsDBNull(i) Then
              Return Nothing
            Else
              Return mDataReader.Item(i)
            End If
          End Get
        End Property    Default Public Overloads ReadOnly Property Item(ByVal name As String) As Object Implements System.Data.IDataRecord.Item
          Get
            Dim value As Object = mDataReader.Item(name)
            If DBNull.Value.Equals(value) Then
              Return Nothing
            Else
              Return value
            End If
          End Get
        End Property    Public ReadOnly Property RecordsAffected() As Integer Implements System.Data.IDataReader.RecordsAffected
          Get
            Return mDataReader.RecordsAffected
          End Get
        End Property
      End ClassEnd Namespace
      

  7.   

    现在出现的问题就是数字类型的字段如何处理.比如,在输入的情况下,value=iif(txtv.text="",nothing,csng(txtv.text=""))
      

  8.   

    Public Property MaxXiaXingDianLiu() As Single
                Get
                    Return mMaxXiaXingDianLiu
                End Get
                Set(ByVal Value As Single)
                    mMaxXiaXingDianLiu = Value
                    dirty()
                End Set
            End Property
    在调试的过程中,发现,中果赋空值,进入set后,仍为0.0,已自动转换.
    如不使用属性,   mMaxXiaXingDianLiu =nothing.再输出其值,仍为0.0并不是nothing.
    这个该如何解释
      

  9.   

    Public Property MaxXiaXingDianLiu() As Single
    改为
    Public Property MaxXiaXingDianLiu() As Object
      

  10.   

    那我在界面上赋值时也要赋判断么?
    if MaxXiaXingDianLiu=nothing then txtv.text="'
      

  11.   

    用反射遍历 Form  中的所有Controls
      

  12.   

    关键是怎么把空值保存在整型字段里。如果是.NET Framework 1.x这样做:1、用SqlInt32保存,空值是SqlInt32.Null。
    SqlInt32 amount = Amount.Text==""?SqlInt32.Null:int.Parse( Amount.Text );
    SqlInt32直接是数据库类型,他与int之间有隐式类型转换。2、用object保存。
    object amount = Amount.Text==""?null:int.Parse( Amount.Text );
    如果是.NET Framework 2.0这样做:用int?保存。
    上面所说的所有方法在创建SqlParameter的时候,都能够自动识别类型……
      

  13.   

    这上语句,和vb的iif应该很相似吧.
    Amount为object类型
    return iif(Amount="",dbnull.value,csng(Amount))
    当Amount=""时,csng(Amount))提示错误"串到..的转换"
    如果我不进行转换将不能运算
      

  14.   

    public object checkNull(object obj)
    {
        if(obj==null||(string)obj=="")
             return DBNull.Value;
        else
             return obj;
    }
      

  15.   

    用户要求,不输入情况下为null,并不是0
    ——————————————————————————————————————
    仅仅是显示吗?如果仅仅是显示问题,那么这样的程序其实没有什么价值,让用户“忍忍”也就算了。如果是业务处理软件,null值与0值得差别影响到一整套业务流程的处理。提出这个问题,一定意味着需求分析“失败”,需要重新分析。
      

  16.   

    一个比较简单的方法就是,数据库不用该,遍历显示表每个Item,如果为0,就把当前值赋为空(""),打印的时候就直接导出当前表,不会有0
      

  17.   

    1,to sp1234(隔离出循环和分支=程序简洁明了+很少歧义+智能),这个是用户无法忍受的。是石油的项目,日产油为0代表没有产油,没有填代表不定数呀。差不多也是显示的问题吧。
    2,to tengfeng8888() 0和空的概念,0就是0,如果是0的也被当空处理也是不对的。
    3,to remymartin(杯中明月),您写的这是什么?应该在那里应用。
      

  18.   

    1,to sp1234(隔离出循环和分支=程序简洁明了+很少歧义+智能),这个是用户无法忍受的。是石油的项目,日产油为0代表没有产油,没有填代表不定数呀。差不多也是显示的问题吧。
    -------------------------------------------------------------------------------------
    这种情况只能去改赋值的地方了,如果全部是用的公用函数还好点,不然要改的地方就多了。
      

  19.   

    如果你的业务逻辑都封装到类了,不如就继承原来的类然后重写必要的方法把相关属性改为自动转换为Null。
      

  20.   

    现在只有一种办法.
    分三步走
    1,属性定义,定义成object类型或是可以赋空值的类型)
    2,赋值时,赋空
    3,保存根据属性的定义,把空值Parameter.Add中的值改为System.DBNull.Valuetry it as quickly as possible
    if that's ok,will be over this discussion.thanks