检查重载中的数据类型对小数不起作用

时间:2017-07-10 16:29:34

标签: vb.net overloading

我正在使用vb.net。当我从数据库中获取数据时,我正在检查和清理我的数据。我正在使用重载但它似乎不适用于十进制数字。十进制数被视为整数。

 Public Class CheckData
    Public Shared Function Check(row As DataRow, columnName As String, pDefaultValue As Decimal) As Decimal
        Dim x As Object = ReplaceDBNullAndColumnExists(row, columnName)
        Dim y As Decimal = CDec(Dempsey.fnIsNull.IsNull(x, pDefaultValue))
        Return y
    End Function
    Public Shared Function Check(row As DataRow, columnName As String, pDefaultValue As DateTime) As DateTime
        Dim x As Object = ReplaceDBNullAndColumnExists(row, columnName)
        Dim y As DateTime = Dempsey.fnIsNull.IsNull(x, pDefaultValue)
        Return y
    End Function
    Public Shared Function Check(row As DataRow, columnName As String, pDefaultValue As Integer) As Integer
        Dim x As Object = ReplaceDBNullAndColumnExists(row, columnName)
        Dim y As Integer = Dempsey.fnIsNull.IsNull(x, pDefaultValue)
        Return y
    End Function
    Public Shared Function Check(row As DataRow, columnName As String, pDefaultValue As String) As String
        Dim x As Object = ReplaceDBNullAndColumnExists(row, columnName)
        Dim y As String = Dempsey.fnIsNull.IsNull(x, pDefaultValue)
        Return y
    End Function
    Public Shared Function Check(row As DataRow, columnName As String, pDefaultValue As Boolean) As Boolean
        Dim x As Object = ReplaceDBNullAndColumnExists(row, columnName)
        Dim y As Boolean = Dempsey.fnIsNull.IsNull(x, pDefaultValue)
        Return y
    End Function

因此,如果我传入一些数据并且类型是字符串,整数,布尔值或日期时间,它将转到属性函数。如果我传入一个小数,它会转到整数。如果我在公共共享函数检查上设置一个断点,它是一个整数函数并执行

row.Table.Columns(columnName).DataType.Name

我回来了 - “十进制”(在即时窗口中执行此操作)

所以我的问题是我做错了什么,它没有把它带到十进制重载并返回一个十进制值。顺便说一句,实际数据值是37.50。

由于 香农

我用它来填充列表。

Public Function populate(mDs As DataSet) As List(Of SR_SalaryRange_Current)
        Dim rows As DataRowCollection
        Dim drow As DataRow
        Dim oSR_SalaryRange_Current As SR_SalaryRange_Current
        Dim oSR_SalaryRange_Currents As List(Of SR_SalaryRange_Current) = New List(Of SR_SalaryRange_Current)
        Dim dt As New DataTable
        Try
            dt = mDs.Tables("SR_SalaryRange_Currents")
            rows = dt.Rows
            For Each drow In rows
                oSR_SalaryRange_Current = New SR_SalaryRange_Current
                With oSR_SalaryRange_Current
                    .tblSR_SalaryRange_CurrentID = SitePlumbing.CheckData.Check(drow, "intTblSR_SalaryRange_CurrentID", 0)
                    .EffectiveDate = SitePlumbing.CheckData.Check(drow, "dtmEffectiveDate", CDate("1/1/1900"))

                    .WorkWeekHours = SitePlumbing.CheckData.Check(drow, "decWorkWeekHours", 0)
                End With
                oSR_SalaryRange_Currents.Add(oSR_SalaryRange_Current)
            Next
        Catch ex As Exception
            ErrorMsg = "Populate Error:" & ex.InnerException.ToString
            Return oSR_SalaryRange_Currents
        End Try
        Return oSR_SalaryRange_Currents
    End Function

从那里进入我之前提到过的checkdata。在上面的代码中,当遇到重载时,它正确地转到整数和日期时间,只是没有为小数执行它。

2 个答案:

答案 0 :(得分:0)

小数可隐式转换为整数,因此如果您将OPTION STRICT设置为off,则编译器会感到困惑。您有两种选择:

1) Set OPTION STRICT to ON.  Then the compiler will not convert implicitly.
2) Pass in a decimal literal like this: 10D (i.e. there is a D on the end telling the compiler it is a decimal).  

例如:

'Sub Routine 1    
public sub Test(ByVal d as decimal)

    end sub

'Sub Routine 2
    public sub Test(ByVal i as integer)

    end sub

//Client
dim d1 as decimal={Number}D 'where {number} is replaced with a number
dim d2 as decimal={Number} 'where {number} is replaced with a number

Test(d1) 'this will always go to Sub Routine 1 regardless of whether OPTION strict is ON or OFF
Test(d2) 'this will go to Sub Routine 1 if option strict is ON.  If it is OFF, then it may go to Sub Routine 2 depending on the size of the number.

答案 1 :(得分:0)

Viorel在另一个论坛上为我提供了一种方法。他建议我做

Check(drow, "decWorkWeekHours", 0@)

确实有效。当我问它做了什么时,这是他的回应。

  

使用'@',常量'0 @'变为小数。然后VB.NET选择带有Decimal参数的Check的定义,因为它比其他候选更适合。   你也可以写'0d'[https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/data-types/type-characters]

希望能帮助其他人继续前进 谢谢 香农