并不傻的问题:空值与0的问题
如题.
在做项目过程中,有一部分数据类型的字段.
用户要求,不输入情况下为null,并不是0
我该如何处理?
项目中多处用到,有没有简单的方法,可以搞定.否则需要修改整个工程.
问题点数:200、回复次数:30Top
1 楼happycoolsky(学习专用帐号)回复于 2006-03-03 11:33:37 得分 5
if TextBox1.text = ""
{
数据字段 = null;
}
else
{
数据字段 = TextBox1.text;
}Top
2 楼happyfamily(FreeHorse)回复于 2006-03-03 11:34:53 得分 10
保存的时候做一个判断,如果为空就给一个DBNull.ValueTop
3 楼coldpanth(^War3^)回复于 2006-03-03 11:35:45 得分 10
将数据库中的字段改为允许空 ,默认值为空
把所有有默认值的方法中的Parameter.Add中的值0改为System.DBNull.Value
Top
4 楼net_lover(【孟子E章】)回复于 2006-03-03 11:36:05 得分 20
项目中多处用到?
你原来怎么写的啊,有没有通用的函数?Top
5 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2006-03-03 11:36:05 得分 15
输入的时候肯定是字符串啊
不输入,字符串就是""也就是String.Empty;
比如,数量这个字段,从界面读入的时候,如果什么都没有输入,就是
string strCount = "";
在填充你的数据库适配器的时候把""转化为null就行了。Top
6 楼yanfan_ever()回复于 2006-03-03 11:36:35 得分 1
在定义的地方,初始化时全都赋为空,然后再转化为数据类型Top
7 楼daishengs(横舟摆渡)回复于 2006-03-03 11:37:15 得分 1
呵呵,我以前的一个项目在接近尾声时,客户也有这样的要求,可我不想大改程序了,我就在前台显示的程序里处理了一下,如果输出为'0'、'XXX.00'的数据就显示为''、'XXX'。Top
8 楼zhongkeruanjian(编程亮子)回复于 2006-03-03 11:39:04 得分 1
不改代码的话,那就再触发器里做吧。Top
9 楼ddangerous169(零点烛光)回复于 2006-03-03 11:40:03 得分 0
有的可能需要参与运算,参与运算的当0处理,界面上显示当空处理Top
10 楼ddangerous169(零点烛光)回复于 2006-03-03 11:43:49 得分 0
有一个类,我用的是clsa架构.Top
11 楼ddangerous169(零点烛光)回复于 2006-03-03 11:45:40 得分 0
Imports System.Data
Namespace 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 Class
End Namespace
Top
12 楼triffang(冲凉不除3)回复于 2006-03-03 13:03:58 得分 10
随便也提个问题:如果是数字型呢,空的话怎么办?Top
13 楼ddangerous169(零点烛光)回复于 2006-03-03 13:10:18 得分 0
现在出现的问题就是数字类型的字段如何处理.
比如,在输入的情况下,value=iif(txtv.text="",nothing,csng(txtv.text=""))Top
14 楼ddangerous169(零点烛光)回复于 2006-03-03 13:12:42 得分 0
Public Property MaxXiaXingDianLiu() As Single
Get
Return mMaxXiaXingDianLiu
End Get
Set(ByVal Value As Single)
mMaxXiaXingDianLiu = Value
markdirty()
End Set
End Property
在调试的过程中,发现,中果赋空值,进入set后,仍为0.0,已自动转换.
如不使用属性, mMaxXiaXingDianLiu =nothing.再输出其值,仍为0.0并不是nothing.
这个该如何解释Top
15 楼lidong6(立冬)回复于 2006-03-03 13:21:09 得分 15
Public Property MaxXiaXingDianLiu() As Single
改为
Public Property MaxXiaXingDianLiu() As ObjectTop
16 楼boy_north(北方的豹子)回复于 2006-03-03 13:30:10 得分 5
判断为空就插入空值呀Top
17 楼ddangerous169(零点烛光)回复于 2006-03-03 13:35:25 得分 0
那我在界面上赋值时也要赋判断么?
if MaxXiaXingDianLiu=nothing then txtv.text="'Top
18 楼goody9807(http://goody9807.cnblogs.com)回复于 2006-03-03 13:42:13 得分 1
用反射遍历 Form 中的所有ControlsTop
19 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-03-03 13:42:32 得分 15
关键是怎么把空值保存在整型字段里。
如果是.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的时候,都能够自动识别类型……Top
20 楼ddangerous169(零点烛光)回复于 2006-03-03 15:10:58 得分 0
这上语句,和vb的iif应该很相似吧.
Amount为object类型
return iif(Amount="",dbnull.value,csng(Amount))
当Amount=""时,csng(Amount))提示错误"串到..的转换"
如果我不进行转换将不能运算Top
21 楼blackmailer()回复于 2006-03-03 19:53:33 得分 1
学习,帮你顶一下!Top
22 楼remymartin(杯中明月)回复于 2006-03-03 22:37:41 得分 5
public object checkNull(object obj)
{
if(obj==null||(string)obj=="")
return DBNull.Value;
else
return obj;
}Top
23 楼sp1234(asp.net不是一个语言,是一个操作系统)回复于 2006-03-03 22:55:17 得分 23
用户要求,不输入情况下为null,并不是0
——————————————————————————————————————
仅仅是显示吗?如果仅仅是显示问题,那么这样的程序其实没有什么价值,让用户“忍忍”也就算了。
如果是业务处理软件,null值与0值得差别影响到一整套业务流程的处理。提出这个问题,一定意味着需求分析“失败”,需要重新分析。Top
24 楼tengfeng8888()回复于 2006-03-03 23:41:42 得分 10
一个比较简单的方法就是,数据库不用该,遍历显示表每个Item,如果为0,就把当前值赋为空(""),打印的时候就直接导出当前表,不会有0Top
25 楼ddangerous169(零点烛光)回复于 2006-03-06 09:13:29 得分 0
1,to sp1234(隔离出循环和分支=程序简洁明了+很少歧义+智能),这个是用户无法忍受的。是石油的项目,日产油为0代表没有产油,没有填代表不定数呀。差不多也是显示的问题吧。
2,to tengfeng8888() 0和空的概念,0就是0,如果是0的也被当空处理也是不对的。
3,to remymartin(杯中明月),您写的这是什么?应该在那里应用。Top
26 楼luckyprg(lucky)回复于 2006-03-06 09:51:09 得分 25
1,to sp1234(隔离出循环和分支=程序简洁明了+很少歧义+智能),这个是用户无法忍受的。是石油的项目,日产油为0代表没有产油,没有填代表不定数呀。差不多也是显示的问题吧。
-------------------------------------------------------------------------------------
这种情况只能去改赋值的地方了,如果全部是用的公用函数还好点,不然要改的地方就多了。Top
27 楼cow8063(天涯远不远?不远!人在天涯,天涯怎会远)回复于 2006-03-06 10:09:21 得分 1
将数据库中的字段改为允许空 ,默认值为空
其它的不用做Top
28 楼nameone(过客)回复于 2006-03-06 10:09:54 得分 1
UPTop
29 楼cat_hsfz(我的新Blog在http://cathsfz.cnblogs.com)回复于 2006-03-06 11:20:31 得分 25
如果你的业务逻辑都封装到类了,不如就继承原来的类然后重写必要的方法把相关属性改为自动转换为Null。Top
30 楼ddangerous169(零点烛光)回复于 2006-03-06 15:32:45 得分 0
现在只有一种办法.
分三步走
1,属性定义,定义成object类型或是可以赋空值的类型)
2,赋值时,赋空
3,保存根据属性的定义,把空值Parameter.Add中的值改为System.DBNull.Value
try it as quickly as possible
if that's ok,will be over this discussion.
thanks
Top




