2010-01-25 17 views
5

Siamo deposito di valori di stringa in un database utilizzando tipo varbinary utilizzando C# e BinaryFormatter.We convertire in array di byte e poi Salva nel databaseConverti array di byte di stringa utilizzando 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, Quindi, se risparmiamo char "a", possiamo vedere "0x0001000000FFFFFFFF0100000000000000060100000001610B" nel database. Dopo aver recuperato i dati e convertito nuovamente in stringa.
Possiamo convertire questo valore binario ("0x0001000000FFFFFFFF0100000000000000060100000001610B") in char ("a") usando solo transact SQL (in modo che possiamo fare modifiche, inserti, confronti dalla console del server sql)?

Grazie mille.

risposta

2

Si potrebbe usare qualcosa di più semplice, come

Encoding.Default.GetBytes("a"); 

che restituirà "61" e può essere più facilmente tradotta in un varchar, solo l'esecuzione di questo:

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

Grazie Rubens, ma questa tecnica è utilizzata per un altro framework (Entlib Contrib http://entlibcontrib.codeplex.com/) e non posso cambiarlo. Lo usano perché quindi possono memorizzare più tipi: interi, stringhe, immagini ecc. Ecc. E vogliamo (solo quando il tipo è stringa) convertire questi valori memorizzati nella stringa – Oscar

+0

Oscar, può essere utile 'BitConverter.GetBytes'? –

+0

ma questo è un metodo dal framework .Net, vero? Voglio usare solo SqlConsole. Lo sto programmando usando le funzioni CLR Sql, secondo Kleinux. Grazie ancora. – Oscar

0

Perché non può hai appena archiviato la stringa originale in una colonna di tipo nvarchar(MAX)? Se si deve utilizzare la colonna varbinary tipo, almeno utilizzare le System.Text.Encoding classi per eseguire la conversione - allora si può decodificare le stringhe in SQL così:

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

E poi usare in questo modo:

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

Grazie Pent, ma questa tecnica è utilizzata per un altro framework (Entlib Contrib http://entlibcontrib.codeplex.com/) e non posso cambiarlo. Lo usano perché quindi possono memorizzare più tipi: interi, stringhe, immagini ecc. Ecc. E vogliamo (solo quando il tipo è stringa) convertire questi valori memorizzati nella stringa – Oscar

+0

Quindi è possibile utilizzare le funzioni definite dall'utente CLR come suggerito da Kleinux. –

2

Suggerirei di utilizzare il metodo descritto http://msdn.microsoft.com/en-us/magazine/cc163473.aspx per utilizzare la libreria regex .NET. Specificamente la sezione per le funzioni definite dall'utente CLR. Potresti semplicemente usare il BinaryFormatter per deserializzare il tuo array di byte.

[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

Sei sodo, non me ne ricordo più ... Vado a vedere. Grazie !! – Oscar