将NaN值插入浮点列

时间:2015-07-08 07:22:37

标签: sql sql-server vb.net floating-point nan

我需要帮助在SQL Server 2012中将浮点列中的NaN值插入为0。

我插入到数据库中的数据来自一个活动目录,有时它生成了NaN值,但我的数据库列被定义为一个浮点数,因为我想从数据库中获取这些值并进行一些计算。

Dim value1 As Double 

sql = "INSERT INTO usb_compliance (Date,atc,value1,) VALUES ('" & Now.Date & "','CMB','" & value1 &"' )" 

1 个答案:

答案 0 :(得分:5)

首先,永远不要连接字符串来创建sql语句 这是一种安全风险,因为它为Sql injection攻击敞开了大门 改为使用参数化查询。

其次,我建议使用null来表示NaN值,因为0.0是有效的浮点值而NaN代表非数字,并且基本上是一个不可知的值,就像Sql server中的null

话虽如此,您只需在vb.net中使用这样的条件:

Sub InsertValues(ByVal atc As String, ByVal value1 As Double, ByVal d As DateTime)
    Dim sql As String = "INSERT INTO usb_compliance (Date,atc,value1) VALUES (@Date, @atc,@value1)"
    ' SqlConnection con is defined and set elsewhere
    Dim cmd As SqlCommand = New SqlCommand(sql, con)
    With cmd
        .Connection.Open()
        .CommandType = CommandType.Text
        .Parameters.Add("@Date", SqlDbType.DateTime).Value = d
        .Parameters.Add("@atc", SqlDbType.NVarChar).Value = atc
        .Parameters.Add("@value1", SqlDbType.Float).Value = IIf(Double.IsNaN(value1), DBNull.Value, value1)
        .ExecuteNonQuery()
    End With
End Sub

' overload since optional parameter can't be non-constant DateTime.Now
Sub InsertValues(ByVal atc As String, ByVal value1 As Double)
    InsertValues(atc, value1, DateTime.Now)
End Sub

就这样称呼它:

 
InsertValues("CMB", value1) '' To use the Now.Date
InsertValues("ERT", value1, DateTime.Now.AddDays(3)) '' to insert the date 3 days from now