Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET:确定查询结果集中字段的数据类型?_Vb.net - Fatal编程技术网

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

VB.NET:确定查询结果集中字段的数据类型?,vb.net,Vb.net,我有从数据库中获取的数字数据。它们都是数字,但它们是int、money和real的混合体 使用VB.NET,如何以编程方式确定resultset中字段的数据类型?由于只能访问基础值而不能访问数据库的结构,因此无法确定值的类型。原因是货币、实数和整数价值领域存在重叠。例如,数字4可能是一个真正的整数,也可能是一个货币 你能给我们提供更多关于这个问题的背景吗?您正在尝试在VB.Net中将原始数据库值转换为Int样式值吗?你能给我们看一些代码吗?由于只能访问基础值,而不能访问数据库的结构,因此无法确定

我有从数据库中获取的数字数据。它们都是数字,但它们是
int
money
real
的混合体


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

由于只能访问基础值而不能访问数据库的结构,因此无法确定值的类型。原因是货币、实数和整数价值领域存在重叠。例如,数字4可能是一个真正的整数,也可能是一个货币


你能给我们提供更多关于这个问题的背景吗?您正在尝试在VB.Net中将原始数据库值转换为Int样式值吗?你能给我们看一些代码吗?

由于只能访问基础值,而不能访问数据库的结构,因此无法确定值的类型。原因是货币、实数和整数价值领域存在重叠。例如,数字4可能是一个真正的整数,也可能是一个货币

你能给我们提供更多关于这个问题的背景吗?您正在尝试在VB.Net中将原始数据库值转换为Int样式值吗?您能给我们看一些代码吗?

假设此表:

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
假设这张表:

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


您如何从数据库中获取数据?您不知道源列的类型吗?存储过程,command.reader您是如何从数据库中获取数据的?你不知道源列的类型吗?storageproecedure,command.readerI我想按原样设置货币格式,保留int原样,将real原样设置为四舍五入到小数点后两位的数字。代码如下:(所有值都以1记录的形式输入。)reader=cmd.ExecuteReader()reader.Read()如果reader.HasRows,则为Me.DataGridView1.Rows.Clear(),i=0到reader.FieldCount-1 Me.DataGridView1.Rows.Add()Me.DataGridView1.RowCount(Me.DataGridView1.RowCount-1)单元格(0.Value=reader.GetName(i).ToString Me.DataGridView1.Rows(Me.DataGridView1.RowCount-1).Cells(1).Value=reader.Item(i).ToString Next Me.DataGridView1.Refresh()结束如果对代码感到抱歉,我发布了可读的代码,并且站点删除了所有空格,等等@bochur1:在您的问题中发布它。我想按原样格式化货币,并保留整数,和实数,四舍五入到小数点后2位。代码如下:(所有值都以1记录的形式输入。)reader=cmd.ExecuteReader()reader.Read()如果reader.HasRows,则为Me.DataGridView1.Rows.Clear(),i=0到reader.FieldCount-1 Me.DataGridView1.Rows.Add()Me.DataGridView1.RowCount(Me.DataGridView1.RowCount-1)单元格(0.Value=reader.GetName(i).ToString Me.DataGridView1.Rows(Me.DataGridView1.RowCount-1).Cells(1).Value=reader.Item(i).ToString Next Me.DataGridView1.Refresh()结束如果对代码感到抱歉,我发布了可读的代码,站点删除了所有空格,等等@bochur1:在您的问题中发布它。信息很棒!!!但是我在vb.net中很难实现这个功能。我试过这样做:如果reader.GetProviderSpecificFieldType(I)=System.Data.SqlTypes.SqlMoney,我得到一个错误,说SqlMoney是一个类型,不能在表达式中使用。GetSchemaTable我在工作上遇到了更多的麻烦,因为智能设备无法接收它。但是当我在调试器中尝试它时,比如:typeof sc.rows(0)。Item(0)是int,我会得到false,无论我尝试将它与什么类型进行比较,我都会得到false。(这是一个整数)。太好了!!谢谢!!>Integer.Parse(number)必须更改为CsCStr(Integer.Parse(CStr(number)))对不起,应该是Integer.Parse(number.ToString()).ToString(),看起来我当时关闭了选项String。ToString比使用CStr好吗?我不确定,但我认为CStr实际上调用了ToString()一旦弄清楚它是什么类型,它就会躲在幕后。ToString()是“.Net”方式,CStr是“VB”方式,两者都不对。非常好的信息!!!但是我在vb.net中很难实现这个功能。我试过这样做:如果reader.GetProviderSpecificFieldType(I)=System.Data.SqlTypes.SqlMoney,我得到一个错误,说SqlMoney是一个类型,不能在表达式中使用。GetSchemaTable我在工作上遇到了更多的麻烦,因为智能设备无法接收它。但是当我在调试器中尝试它时,比如:typeof sc.rows(0)。Item(0)是int,我会得到false,无论我尝试将它与什么类型进行比较,我都会得到false。(这是一个整数)。太好了!!谢谢!!>Integer.Parse(number)必须更改为CsCStr(Integer.Parse(CStr(number)))对不起,应该是Integer.Parse(number.ToString()).ToString(),看起来我当时关闭了选项String。ToString比使用CStr好吗?我不确定,但我认为CStr实际上调用了ToString()一旦弄清楚它是什么类型,它就会躲在幕后。ToString()是“.Net方式”,CStr是“VB”方式,两者都不对。