2010-04-28 13 views
6

Vorrei recuperare alcuni dati binari da una colonna varbinary(max) in un database SQL Server a scopo di debug.Ripristino ad-hoc di dati dalla colonna varbinary di SQL Server

Qual è il modo più semplice per ottenere questi dati in un file binario locale, preferibilmente senza dover scrivere un'applicazione di console throw-away?

Ho provato a utilizzare SQL Server Management Studio (con l'opzione "risultati su file") ma questo restituisce una stringa binaria con codifica esadecimale nel file, anziché i dati binari non elaborati.

+3

Non sono sicuro se questo è quello che cercavi, ma conosci LINQPad? È fondamentalmente un'applicazione in cui è possibile scrivere applicazioni C# "da buttare". –

risposta

3

ho trovato this solution con bcp comando (eseguito da riga di comando):

c:\temp>bcp "select MYVARBINARYCOL from MYTABLE where id = 1234" queryout "c:\filename.pdf" -S MYSQLSERVER\MYINSTANCE -T 

Enter the file storage type of field filedata [varbinary(max)]: 
Enter prefix-length of field filedata [8]: 0 
Enter length of field filedata [0]: 
Enter field terminator [none]: 

Do you want to save this format information in a file? [Y/n] n 

Starting copy... 

1 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.) Total : 15 Average : (66.67 rows per sec.) 

ho usato l'opzione -T per utilizzare l'autenticazione di Windows per la connessione al DB. Se si utilizza la password auth, è necessario utilizzare le opzioni -U e -P per specificare un nome utente e una password.

Ma mi piace anche il suggerimento LinqPad in Robb Sadler's answer e in qualche modo lo preferisco.

6

non riesco a pensare a un modo più semplice per farlo che un buttare via po 'di C# ...

static void Main(string[] args) 
    { 
     GetBinaryDataToFile("Server=localhost;Initial Catalog=ReportServer;Integrated Security=true", "D:\\temp.dat"); 
    } 

    public static void GetBinaryDataToFile(string connectionString, string path) 
    { 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 

      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = "SELECT Sid FROM Users WHERE UserID = '62066184-8403-494E-A571-438ABF938A4F'"; 
       command.CommandType = CommandType.Text; 

       using (SqlDataReader dataReader = command.ExecuteReader()) 
       { 
        if (dataReader.Read()) 
        { 
         SqlBinary sqlBinary = dataReader.GetSqlBinary(0); 
         File.WriteAllBytes(path, sqlBinary.Value); 
        } 

        dataReader.Close(); 
       } 
      } 

      connection.Close(); 
     } 
    } 

Questo codice è stata testata con la colonna Users.Sid ​​(che è di tipo varbinary) in un'installazione predefinita di SQL Server con Reporting Services.

4

Mi è piaciuto molto il suggerimento LinqPad. Ho provato e ho avuto una query che sputa il file binario in un file entro 10 minuti. No VS Project, no build - e ora lo script viene salvato e posso richiamarlo in qualsiasi momento. Così bello!

sceneggiatura

LINQPad:

var g = from pd in Archives 
    where pd.ArchiveId == 123 
    select pd; 

var q = from p in printDocs 
where p.DocumentId == g.SingleOrDefault().DocumentId 
select p; 

File.WriteAllBytes("C:\\temp.pdf", q.SingleOrDefault().Pdf.ToArray()); 
+0

Non capisco. Come funziona in LinqPad? Dove sono definiti gli "archivi"? Stai facendo riferimento ad alcune librerie esterne in cui sono definite le entità Linq-to-SQL/EntityFramework? –

+0

Sono collegato al mio database e LinqPad ha creato automaticamente la classe di dati Linq to Sql. Potrei quindi accedervi e usarlo. Questo fa parte di ciò che lo rende interessante. Si tratta di un download rapido - consiglio di dargli un vortice. Questo era l'unico codice che ho scritto. –