2011-01-12 7 views
1

Mit SQL Server 2008 habe ich eine gespeicherte Prozedur, die einen VarBinary-Parameter akzeptiert. Während der Parameter im Speicher ist, möchte ich es in das Verzeichnis% temp% des SQL Servers schreiben.TSQL im Speicher VarBinary in Textdatei?

Wie kann ich aus dem Speicher Blob (es kam als ein Byte [] aus einer C# -App) in die Textdatei? Das Blob ist in keiner plattenresistenten Tabelle vorhanden.

Ich lehne mich in Richtung TSQL sproc Aufruf einer CLR gespeicherte Prozedur, die bisher (meistens) wie folgt aussieht.

Problem # 1 ist, dass ich denke, dass die inputBytes [] bei 8k Eingabegröße stecken bleibt.

Problem # 2 ist, dass ich nicht mit etwas anständigen SQL kommen kann, die einen varbinary Wert als Parameter übergibt, so dass ich dies in Management Studio oder VS DB Unit Test testen kann.

public static void FileWrite(string inputName , byte[] inputBytes) 
using (FileStream fileStream = new  
    FileStream(Environment.GetEnvironmentVariable("TEMP") + "\\" + inputName, 
    FileMode.OpenOrCreate, FileAccess.Write)) 
    { 
     using (BinaryWriter binaryWriter = new BinaryWriter(fileStream)) 
     { 
      binaryWriter.Write(inputBytes); 
    } 
} 

Danke.

Antwort

0

Wenn Sie das byte [] in C# -Code haben, könnte man leicht in eine Datei schreiben:

http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx

Würden diese Arbeit für Sie?

EDIT: Eine andere Idee, wenn Sie die Datei von SQL Server speichern müssen, könnte eine SQL Server CLR Function erstellen. Dadurch können Sie C# -Code von SQL Server ausführen.

EDIT 2: Ich habe eine Google-Suche und fand einen Artikel auf CodeProject. In dem Artikel komprimieren und dekomprimieren sie Blob-Daten. Ich denke, der Trick hier ist, den SqlBytes Parametertyp gegen ein einfaches altes Byte [] zu verwenden. Nachfolgend finden Sie einige (ungetestet) Code kam ich mit nach den Artikel und die aktualisierte Frage zu lesen:

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 

using System.IO; 
using System.IO.Compression; 

public partial class UserDefinedFunctions 
{ 
    // Setting function characteristics 
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic=true, DataAccess=DataAccessKind.None)] 
    public static void fn_WriteToFile(string fileName, SqlBytes blob) 
    { 
     if(blob.IsNull || String.IsNullOrEmpty(fileName)) 
     { 
      return; 
     } 

     String fullFileName = Path.Combine(Environment.GetEnvironmentVariable("TEMP"), fileName); 
     using(FileStream fileStream = new FileStream(fullFileName, FileMode.OpenOrCreate, FileAccess.Write)) 
     using(BinaryWriter binaryWriter = new BinaryWriter(fileStream)) 
     { 
      binaryWriter.Write(blob.Buffer); 
     } 
    } 
}; 

Lassen Sie mich wissen, was Sie denken.

+0

Danke, während du mich auf einen CLR-Sproc zeigst, ging ich selbst diesen Weg hinunter. Ich kann nicht herausfinden, wie man eine unbegrenzte Größe VarBinary (Max) nimmt und es an den CLR-Sproc als ein Byte [] sendet, damit ich es schreiben kann .... Zeit, meinen ursprünglichen Post zu redigieren. Vielen Dank. – Snowy

+0

Dana, das ist großartig. Der Schlüssel war der SqlBytes-Typ. Vielen Dank! – Snowy

+0

Kein Problem. Viel Glück, es zur Arbeit zu bringen :) – dana