2010-02-02 70 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

相關問題