2010-01-25 22 views
5

Estamos valores de cadena de tiendas en una base de datos utilizando el tipo varbinary usando C# y BinaryFormatter.We convertir en matriz de bytes y luego guardar la base de datosConvertir matriz de bytes a cadena mediante Transact-SQL

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, así que si salvamos char "a", podemos ver "0x0001000000FFFFFFFF0100000000000000060100000001610B" en la base de datos. Después de que podamos recuperar los datos y convertir nuevamente a cadena.
¿Podemos convertir este valor binario ("0x0001000000FFFFFFFF0100000000000000060100000001610B") en char ("a") solo utilizando transacciones SQL (para que podamos hacer modificaciones, inserciones, comparaciones desde la consola del servidor sql)?

Muchas gracias.

Respuesta

2

Usted podría utilizar algo más simple, como

Encoding.Default.GetBytes("a"); 

que devolverá "61" y puede traducirse más fácilmente a un varchar, acaba de ejecutar este:

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

Gracias a Rubens, pero esta técnica se usa para otro marco (Entlib Contrib http://entlibcontrib.codeplex.com/) y no puedo cambiarla. Lo usan porque entonces pueden almacenar más tipos: enteros, cadenas, imágenes, etc. y queremos (solo cuando el tipo es cadena) convertir estos valores almacenados a la cadena – Oscar

+0

Oscar, ¿puede ser útil 'BitConverter.GetBytes'? –

+0

pero este es un método del framework .Net, ¿o no? Quiero usar solo SqlConsole. Lo estoy programando usando funciones CLR Sql, según Kleinux. Gracias de nuevo. – Oscar

0

¿Por qué no puede solo almacena la cadena original en una columna de tipo nvarchar(MAX)? Si usted tiene que utilizar la columna de la varbinary tipo, entonces por lo menos usar los System.Text.Encoding clases para hacer la conversión - entonces usted puede decodificar las cadenas en SQL, así:

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

y luego usarlo como esto:

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

Gracias Pent, pero esta técnica se usa para otro marco (Entlib Contrib http://entlibcontrib.codeplex.com/) y no puedo cambiarla. Lo usan porque entonces pueden almacenar más tipos: enteros, cadenas, imágenes, etc. y queremos (solo cuando el tipo es cadena) convertir estos valores almacenados a la cadena – Oscar

+0

Luego puede usar las funciones CLR definidas por el usuario como lo sugiere Kleinux. –

2

Sugiero usar el método descrito http://msdn.microsoft.com/en-us/magazine/cc163473.aspx para usar la biblioteca .NET regex. Específicamente la sección para Funciones definidas por el usuario de CLR. Simplemente podría usar BinaryFormatter para deserializar su matriz de bytes.

[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

Usted es correcto, no lo recuerdo ... lo voy a ver. ¡Gracias! – Oscar

Cuestiones relacionadas