Description

<# SYNOPSIS
      Export of large BLOB data with Ado.Net
   DESCRIPTION
      Export of small BLOB data using the GetBytes of Ado.Net SqlDataReader without any conversions.
      The data stream is read chunk by chunk in the predefined size, in this sample 8 KB.
      This methode has a good performance for larger BLOB data. Existing files will be overwritten.
   NOTES
      Author  : Olaf Helper
      Requires: PowerShell Version 2.0, Ado.Net assembly
   LINK
      GetBytes: http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqldatareader.getbytes.aspx
      Retrieving Large Data (ADO.NET): http://msdn.microsoft.com/en-us/library/87z0hy49.aspx
#>

Script

PowerShell
Skript bearbeiten|{#scriptcode_dlg.remove_script}
<# SYNOPSIS 
      Export of large BLOB data with Ado.Net 
   DESCRIPTION 
      Export of small BLOB data using the GetBytes of Ado.Net SqlDataReader without any conversions. 
      The data stream is read chunk by chunk in the predefined size, in this sample 8 KB. 
      This methode has a good performance for larger BLOB data. Existing files will be overwritten. 
   NOTES 
      Author  : Olaf Helper 
      Requires: PowerShell Version 2.0, Ado.Net assembly 
   LINK 
      GetBytes: http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqldatareader.getbytes.aspx 
      Retrieving Large Data (ADO.NET): http://msdn.microsoft.com/en-us/library/87z0hy49.aspx 
#> 
 
# Configuration data 
[string] $server   = ".\SQLEXPRESS";       # SQL Server Instance 
[string] $database = "AdventureWorks";     # Database containing the BLOB data. 
[string] $folder   = "D:\Export\";         # Path to export to 
[int]    $bufferSize = 8192;               # Stream buffer size in bytes. 
 
# Select-Statement for name & blob with (optional) filter. 
[string] $sql = "SELECT [FileName], [Document] 
                 FROM Production.Document 
                 WHERE FileExtension = '.doc'"; 
 
# Open ADO.NET Connection with Windows authentification. 
$con = New-Object Data.SqlClient.SqlConnection; 
$con.ConnectionString = "Data Source=$server;Initial Catalog=$database;Integrated Security=True;" 
$con.Open(); 
 
Write-Output ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Started ..."); 
 
# New command and reader 
$cmd = New-Object Data.SqlClient.SqlCommand $Sql$con$rd = $cmd.ExecuteReader(); 
 
# Create a byte array for the stream. 
$out = [array]::CreateInstance('Byte'$bufferSize) 
 
# Looping through all selected records. 
While ($rd.Read()) 
{ 
    try 
    { 
        Write-Output ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Exporting {0}" -$rd.GetString(0)); 
         
        # New BinaryWriter; existing file will be overwritten. 
        $fs = New-Object System.IO.FileStream ($folder + $rd.GetString(0)), Create, Write; 
        $bw = New-Object System.IO.BinaryWriter $fs; 
        
        $start = 0; 
        # Read first byte stream chunk. 
        $received = $rd.GetBytes(1, $start$out, 0, $bufferSize - 1); 
        While ($received -gt 0) 
        { 
           $bw.Write($out, 0, $received); 
           $bw.Flush(); 
           $start +$received; 
           # Read next byte stream chunk. 
           $received = $rd.GetBytes(1, $start$out, 0, $bufferSize - 1); 
        } 
 
        $bw.Close(); 
        $fs.Close(); 
    } 
    catch 
    { 
        Write-Output ($_.Exception.Message) 
    } 
    finally 
    { 
        $fs.Dispose();         
    }         
} 
 
# Closing & Disposing all objects. 
$rd.Close(); 
$cmd.Dispose(); 
$con.Close(); 
 
Write-Output ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Finished.");