2010-01-25 16 views
5

Wir sind Werte speichern Zeichenfolge in einer Datenbank VarBinary Typ mit C# und BinaryFormatter.We auf Byte-Array umwandeln und dann speichern wir DataBaseConvert Byte-Array in String TransactSQL mit

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, also wenn wir sparen Char "a", können wir "0x0001000000FFFFFFFF0100000000000000060100000001610B" in der Datenbank sehen. Nachdem wir die Daten abrufen und wieder in Zeichenfolge konvertieren können.
Können wir diesen binären Wert ("0x0001000000FFFFFFFF010000000000000006010000000001610B") in char ("a") konvertieren nur mit Transact SQL (so können wir Änderungen, Einfügungen, Vergleiche von SQL Server-Konsole)?

Vielen Dank.

Antwort

2

Sie könnten etwas einfacher, als

Encoding.Default.GetBytes("a"); 

, dass „61“ zurück zu bedienen und zu einem varchar leicht übersetzt mehr werden kann, läuft gerade dies:

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

Dank Rubens, aber diese Technik wird für ein anderes Framework (Entlib Contrib http://entlibcontrib.codeplex.com/) verwendet und kann es nicht ändern. Sie verwenden es, weil thay mehr Typen speichern kann: ints, string, images etc etc und wir wollen (nur wenn der type string ist) diese gespeicherten Werte in string konvertieren – Oscar

+0

Oscar, kann 'BitConverter.GetBytes' nützlich sein? –

+0

aber das ist eine Methode aus dem .Net-Framework, nicht wahr? Ich möchte nur SqlConsole verwenden. Ich programmiere es mit CLR Sql Funktionen, nach Kleinux. Danke nochmal. – Oscar

0

Warum kann Sie speichern nur die ursprüngliche Zeichenfolge in einer nvarchar(MAX) Spalte? Wenn Sie die varbinary Typ Spalte verwenden müssen, dann zumindest verwenden, um die System.Text.Encoding Klassen um die Konvertierung zu tun - dann können Sie auch die Zeichenfolgen in SQL-dekodieren:

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

Und es dann wie folgt verwenden:

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

Danke Pent, aber diese Technik wird für ein anderes Framework (Entlib Contrib http://entlibcontrib.codeplex.com/) verwendet und kann es nicht ändern. Sie verwenden es, weil dann mehr Typen gespeichert werden können: Ints, String, Bilder usw. Wir wollen (nur wenn der Typ String ist) diese gespeicherten Werte in String umwandeln – Oscar

+0

Dann könnten Sie CLR benutzerdefinierte Funktionen wie von Kleinux vorgeschlagen verwenden. –

2

Ich würde empfehlen, die beschriebene Methode http://msdn.microsoft.com/en-us/magazine/cc163473.aspx zu verwenden, um die .NET-Regex-Bibliothek zu verwenden. Insbesondere der Abschnitt für benutzerdefinierte CLR-Funktionen. Sie könnten einfach den BinaryFormatter verwenden, um Ihr Byte-Array zu deserialisieren.

+0

Sie sind richtig, ich habe mich nicht daran erinnert ... Ich werde es sehen. Danke !! – Oscar