2011-09-27 56 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