我有来自数据库的数字数据。它们都是数字,但它们是int
,money
和real
的混合体。
使用VB.NET,如何以编程方式确定结果集中字段的数据类型?
答案 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样式值?你能告诉我们一些代码吗?