2010-02-02 73 views
1

我有我从数据库中获取的数字数据。它们都是数字,但它们是int,moneyreal的混合。VB.NET:确定查询结果集中字段的数据类型?

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

+0

如何从数据库中获取数据?你不知道源列的类型吗? – jason 2010-02-02 18:22:59

+0

存储过程,command.reader – Alex 2010-02-03 06:33:55

回答

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 
+0

了解详情!!! 但是我无法在vb.net中使用它。 我试过这个: 如果reader.GetProviderSpecificFieldType(i)= System.Data.SqlTypes.SqlMoney 我得到一个错误,说SqlMoney是一个Type并且不能在表达式中使用。 GetSchemaTable由于intelisence没有选择它,所以我在上班时遇到了更多麻烦。 但是当我在调试器中尝试它时,像: typeof sc.rows(0)。Item(0)是int我得到了错误,并且我得到了false,无论我尝试将它与哪种类型进行比较。 (它是一个整数)。 – Alex 2010-02-03 04:19:34

+0

太棒了!谢谢!! (Integer.Parse(CStr(number))) – Alex 2010-02-03 16:56:54

+0

不好意思,应该是Integer.Parse(number.ToString())。ToString(),看起来像我当时有Option String Off。 – 2010-02-03 17:05:52

0

只能访问基础值而不访问数据库的结构,因此无法明确地告诉数据类型是什么类型。原因是Money,Real和Int值的领域存在重叠。例如,数字4可能既是真实的,也可能是金钱。

您能否就这个问题给我们更多的背景?你是否试图将原始数据库值转换为VB.Net中的Int样式值?你能告诉我们一些代码吗?

+0

我想格式化货币,并保持原样,真正的数字四舍五入到2个小数位。 的代码是这样的:(所有的值都为1个结果进来) 读者= cmd.ExecuteReader() reader.Read() 如果reader.HasRows然后 Me.DataGridView1.Rows.Clear() 对于i.Rows(Me.DataGridView1.RowCount - 1).Cells(0).Value = reader.GetName(i).ToString Me.DataGridView1.Rows(Me.DataGridView1.RowCount - 1).Cells(1)。价值= reader.Item(ⅰ)的ToString 接着 Me.DataGridView1.Refresh() 结束如果 – Alex 2010-02-02 18:38:19

+0

遗憾的代码,我发布它可读和网站掉落所有空间,等 – Alex 2010-02-02 18:39:00

+0

@ bochur1:发布它在你的问题。 – jason 2010-02-02 18:41:14

相关问题