2016-11-17 75 views
1

使用ASP.Net應用程序使用SQLDataReader從SQL數據庫中獲取IPv4信息。從SQL讀取IP時,數據類型是二進制的,我不確定處理這種情況的最佳方法。使用SQLDataReader讀取IP地址

由於沒有方法SQLDataReader.GetIPAddress()似乎我需要使用SQLDataReader.GetBytes()?許多關於如何做到這一點的例子,但是因爲getstring非常簡單,我希望有另一種更簡單的方法來使用getbyte()或其他方法來引入IP。

Do While SQLReader.Read() 
     Dim lastcom As System.DateTime = SQLReader.GetDateTime(0) 
     Debug.WriteLine(lastcom.ToString("MM/dd/yyyy HH:mm:ss.fff")) 
     Debug.WriteLine(SQLReader.GetString(1)) 
     Debug.WriteLine(SQLReader.GetBoolean(2)) 
     Debug.WriteLine(SQLReader.GetString(3)) 
     Debug.WriteLine(SQLReader.GetString(4)) 
     Label_IP = SQLReader.GetString(1)    
     Label_Model.Text = SQLReader.GetString(4) 
    Loop 
+2

你試圖轉換此到C#?什麼是IP存儲在數據庫中,我假設它將被存儲爲'String',例如'varchar'或'nvarchar'。 – Greg

+0

沒有必要轉換爲C#..我通常在vb.net寫.. Getstring失敗說「無法投入類型'System.Byte []'的對象鍵入'System.String'。」 GetDataTypeName返回列的二進制值,但在數據庫中,該列僅包含格式類似於xx.xx.xx.xx的實際ipv4地址。 – jewbacca

+0

我拒絕編寫Visual Basic,但是以'byte []'的形式檢索,而在C#中,您只需執行:'System.Text.Encoding.GetString(...)'。因此,將byte []從字節數據轉換回字符串值。 – Greg

回答

0

我提出有關IP地址是如何存儲在數據庫中(且僅支持IPv4地址)的一些假設,但你可以嘗試這樣的事:

Dim ipAddr(3) As Byte 
' Assuming that column #1 is your IP address column 
Dim byteCount = SQLReader.GetBytes(1, 0, ipAddr, 0, 4) 
If byteCount = 4 Then 
    Label_IP.Text = New IPAddress(ipAddr).ToString() 
Else 
    Console.WriteLine("Expected 4 bytes for IP address") 
End If 
+0

工作完美!謝謝!另外看了一下,發現一些存儲過程在sql端負責二進制轉換。不知道爲什麼這裏是這種情況,但任何方式非常感謝幫助! – jewbacca

+0

@jewbacca很高興幫助。不知道存儲過程會做什麼 - ['IPAddress.GetAddressBytes'](https://msdn.microsoft.com/en-us/library/system.net.ipaddress.getaddressbytes(v = vs.110).aspx)將返回一個IP地址的字節數組。您可能還想談一談[this](https://stackoverflow.com/help/someone-answers) - 投票/接受答案是表達謝意的最佳方式。 :-) – Mark