2010-01-25 37 views
5

Chúng tôi đang giá trị chuỗi cửa hàng trong một cơ sở dữ liệu sử dụng varbinary loại sử dụng C# và BinaryFormatter.We chuyển sang mảng byte và sau đó chúng tôi lưu vào DataBaseChuyển đổi Byte Array chuỗi sử dụng TransactSQL

public static byte[] ToBytes(stringvalue) 
{ 
    if (value == null) 
    return null; 

    byte[] inMemoryBytes; 
    using (MemoryStream inMemoryData = new MemoryStream()) 
    { 
    new BinaryFormatter().Serialize(inMemoryData, value); 
    inMemoryBytes = inMemoryData.ToArray(); 
    } 

    return inMemoryBytes; 
} 

OK, Vì vậy, nếu chúng ta tiết kiệm char "a", chúng ta có thể thấy "0x0001000000FFFFFFFF0100000000000000060100000001610B" trong cơ sở dữ liệu. Sau khi chúng tôi có thể truy xuất dữ liệu và chuyển đổi thành chuỗi.
Chúng ta có thể chuyển đổi giá trị nhị phân này ("0x0001000000FFFFFFFF0100000000000000060100000001610B") thành char ("a") chỉ sử dụng giao dịch SQL (vì vậy chúng ta có thể sửa đổi, chèn, so sánh từ giao diện điều khiển máy chủ sql)?

Thanks a lot.

Trả lời

2

Bạn có thể sử dụng một cái gì đó đơn giản hơn, như

Encoding.Default.GetBytes("a"); 

Đó sẽ trở lại "61" và có thể được dễ dàng hơn dịch sang một varchar, chỉ cần chạy này:

create table #sample (content varbinary(max)); 
insert into #sample values (0x61) 
select cast(content as varchar) from #sample 
+0

Cảm ơn Rubens, nhưng tecnique này được sử dụng cho một khuôn khổ khác (Entlib Contrib http://entlibcontrib.codeplex.com/) và không thể thay đổi nó. Họ sử dụng nó bởi vì sau đó thay có thể lưu trữ nhiều loại: ints, string, images etc vv và chúng ta muốn (chỉ khi kiểu string) chuyển đổi giá trị được lưu trữ này thành chuỗi – Oscar

+0

Oscar, có thể 'BitConverter.GetBytes' hữu ích không? –

+0

nhưng đây là một phương pháp từ khung .Net, phải không? Tôi chỉ muốn sử dụng SqlConsole. Tôi đang lập trình nó bằng cách sử dụng các hàm CLR Sql, theo Kleinux. Cảm ơn bạn lần nữa. – Oscar

0

Tại sao có thể không bạn chỉ cần lưu trữ chuỗi gốc trong cột loại nvarchar(MAX)? Nếu bạn phải sử dụng cột varbinary loại, sau đó sử dụng ít nhất System.Text.Encoding lớp học để làm việc chuyển đổi - sau đó bạn có thể giải mã các chuỗi trong sql cũng như:

public static byte[] ToBytes(string value) 
{ 
    if (value == null) return null; 
    return System.Text.Encoding.Unicode.GetBytes(value); 
} 

Và sau đó sử dụng nó như thế này:

select cast(VarBinaryField as nvarchar(max)) from SomeTable 
+0

Cảm ơn Pent, nhưng tecnique này được sử dụng cho một framework khác (Entlib Contrib http://entlibcontrib.codeplex.com/) và không thể thay đổi nó. Họ sử dụng nó bởi vì sau đó thay có thể lưu trữ nhiều loại: ints, string, images etc vv và chúng ta muốn (chỉ khi kiểu string) chuyển đổi giá trị được lưu trữ này thành chuỗi – Oscar

+0

Sau đó, bạn có thể sử dụng hàm CLR do người dùng định nghĩa như đề xuất bởi Kleinux. –

2

Tôi khuyên bạn nên sử dụng phương pháp được mô tả http://msdn.microsoft.com/en-us/magazine/cc163473.aspx để sử dụng thư viện .NET regex. Cụ thể là phần cho CLR User Defined Functions. Bạn chỉ có thể sử dụng BinaryFormatter để deserialize mảng byte của bạn.

[SqlFunction] 
public static string ToStringFromBytes(byte[] value) 
{ if (value == null) return null; 

    using (MemoryStream inMemoryData = new MemoryStream(value)) 
    { 
    return new BinaryFormatter().Deserialize(inMemoryData) as string; 
    } 
} 
+0

Bạn cứng nhắc, tôi không nhớ về nó ... Tôi sẽ thấy. Cảm ơn !! – Oscar

Các vấn đề liên quan