VB.NET:确定查询结果集中字段的数据类型?

时间:2010-02-02 18:21:02

标签: vb.net

我有来自数据库的数字数据。它们都是数字,但它们是intmoneyreal的混合体。

使用VB.NET,如何以编程方式确定结果集中字段的数据类型?

2 个答案:

答案 0 :(得分:1)

假设这个表:

CREATE TABLE TestTable
(
Col1 int,
Col2 dec(9,2),
Col3 money
)

使用这些值:

INSERT INTO TestTable VALUES (1, 2.5, 3.45)

您可以使用以下代码将类型作为.Net类型:

    Dim DSN = "SERVER=XYZ;UID=XYZ;PWD=XYZ;DATABASE=XYZ"
    Using Con As New SqlConnection(DSN)
        Con.Open()
        Using Com As New SqlCommand("SELECT * FROM TestTable", Con)
            Com.CommandType = CommandType.Text
            Using RDR = Com.ExecuteReader()
                If RDR.Read Then
                    Trace.WriteLine(RDR.GetProviderSpecificFieldType(0)) 'Returns System.Data.SqlTypes.SqlInt32
                    Trace.WriteLine(RDR.GetProviderSpecificFieldType(1)) 'Returns System.Data.SqlTypes.SqlDecimal
                    Trace.WriteLine(RDR.GetProviderSpecificFieldType(2)) 'Returns System.Data.SqlTypes.SqlMoney
                End If
            End Using
        End Using
        Con.Close()
    End Using

您也可以使用它来获取该类型的SQL文本版本:

    Dim DSN = "SERVER=XYZ;UID=XYZ;PWD=XYZ;DATABASE=XYZ"
    Using Con As New SqlConnection(DSN)
        Con.Open()
        Using Com As New SqlCommand("SELECT * FROM TestTable", Con)
            Com.CommandType = CommandType.Text
            Using RDR = Com.ExecuteReader()
                If RDR.Read Then
                    Using SC = RDR.GetSchemaTable()
                        Trace.WriteLine(SC.Rows(0).Item("DataTypeName")) 'Returns int
                        Trace.WriteLine(SC.Rows(1).Item("DataTypeName")) 'Returns decimal
                        Trace.WriteLine(SC.Rows(2).Item("DataTypeName")) 'Returns money
                    End Using
                End If
            End Using
        End Using
        Con.Close()
    End Using

修改

以下是如何进行类型比较以及格式化事物的辅助函数。输出再次假设上述SQL。

    Dim DSN = "SERVER=XYZ;UID=XYZ;PWD=XYZ;DATABASE=XYZ"
    Using Con As New SqlConnection(DSN)
        Con.Open()
        Using Com As New SqlCommand("SELECT * FROM TestTable", Con)
            Com.CommandType = CommandType.Text
            Using RDR = Com.ExecuteReader()
                If RDR.Read Then
                    Trace.WriteLine(FormatNumber(RDR.Item(0), RDR.GetProviderSpecificFieldType(0))) '1
                    Trace.WriteLine(FormatNumber(RDR.Item(1), RDR.GetProviderSpecificFieldType(1))) '2.50
                    Trace.WriteLine(FormatNumber(RDR.Item(2), RDR.GetProviderSpecificFieldType(2))) '$3.45
                End If
            End Using
        End Using
        Con.Close()
    End Using

Private Shared Function FormatNumber(ByVal number As Object, ByVal type As Type) As String
    If number Is Nothing Then Throw New ArgumentNullException("number")
    If type Is Nothing Then Throw New ArgumentNullException("type")
    If type.Equals(GetType(System.Data.SqlTypes.SqlInt32)) Then
        Return Integer.Parse(number)
    ElseIf type.Equals(GetType(System.Data.SqlTypes.SqlDecimal)) Then
        Return Decimal.Parse(number.ToString()).ToString("N")
    ElseIf type.Equals(GetType(System.Data.SqlTypes.SqlMoney)) Then
        Return Decimal.Parse(number.ToString()).ToString("C")
    End If
    Throw New ArgumentOutOfRangeException(String.Format("Unknown type specified : " & type.ToString()))
End Function

答案 1 :(得分:0)

只能访问基础值而不是数据库结构,因此无法明确告知该值的类型。原因是Money,Real和Int值的区域存在重叠。例如,数字4可以是Real和Int,也可能是Money。

您能否就此问题向我们提供更多背景信息?您是否尝试将原始数据库值转换为VB.Net中的Int样式值?你能告诉我们一些代码吗?