2011-09-27 81 views

回答

3
SqlConnection conn = new SqlConnection(yourConnectionString); 
    SqlCommand cmd = new SqlCommand("select col from yourtable", conn); 
    SqlDataReader reader = cmd.ExecuteReader(); 
    if (reader.HasRows) 
    { 
     byte[] bytes = (byte[])reader[0]; 
    } 
    reader.Close(); 
    conn.Close(); 
+0

謝謝 - 但我想從SQL Server Management Studio窗口剪切並粘貼文本。我不想重新查詢數據庫。 – Slaggg

+2

SSMS是設計用於顯示格式化數據的客戶端應用程序。它不具有訪問從數據庫返回的底層二進制數據的接口。這就是這個答案中描述的編程接口。 SSMS是錯誤的工具。 –

+0

@ChrisSmith我不同意 - 在二進制數據字段的SSMS文本表示中顯示的文本內容顯然與存儲在該字段中的實際數據相關。 – Slaggg

24

OK,所以你要複製並粘貼varbinary列(例如「0x6100730064006600」)顯示在SSMS的價值,並獲得在C#中的字節[]從它?

這很簡單 - 0x之後的部分只是十六進制值(每個2個字符)。所以,你需要每一對,將其轉換爲一個數字,16(十六進制)的基礎上,並把它添加到列表,像這樣:

string stringFromSQL = "0x6100730064006600"; 
List<byte> byteList = new List<byte>(); 

string hexPart = stringFromSQL.Substring(2); 
for (int i = 0; i < hexPart.Length/2; i++) 
{ 
    string hexNumber = hexPart.Substring(i * 2, 2); 
    byteList.Add((byte)Convert.ToInt32(hexNumber, 16)); 
} 

byte [] original = byteList.ToArray(); 

免責聲明 - 相當狡猾和unoptimal代碼,我只是黑客攻擊一起用於演示目的(它應該可以工作)。

+0

爲什麼你的代碼不是最理想的?在我看來,這似乎相當不錯:) –

+1

@Żubrówka - 在可讀性方面,它並不算太壞;就性能而言,我們可以簡單地使用一個數組,因爲我們知道它究竟需要多大。使用不同的數據結構,然後.ToArray() - 它似乎有點鬆懈,但我主要是爲了清晰和可讀性做的:) –

+2

使我的一天。非常感謝 – rank1