I've found a useful script on Technet I'm having trouble getting to run (https://social.technet.microsoft.com/wiki/contents/articles/890.export-sql-server-blob-data-with-powershell.aspx)
$Server = ".SQL"; # SQL Server Instance.
$Database = "TESTDB";
$Dest = "C:OFSQLOUT"; # Path to export to.
$bufferSize = 8192; # Stream buffer size in bytes.
# Select-Statement for name & blob
# with filter.
$Sql = "SELECT [Blob]
,[Blob2]
FROM [TESTDB].[dbo].[Pictures]";
# Open ADO.NET Connection
$con = New-Object Data.SqlClient.SqlConnection;
$con.ConnectionString = "Data Source=$Server;" +
"Integrated Security=True;" +
"Initial Catalog=$Database";
$con.Open();
# 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 records
While ($rd.Read())
{
Write-Output ("Exporting: {0}" -f $rd.GetString(0));
# New BinaryWriter
$fs = New-Object System.IO.FileStream ($Dest + $rd.GetString(0)), Create, Write;
$bw = New-Object System.IO.BinaryWriter $fs;
$start = 0;
# Read first byte stream
$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
$received = $rd.GetBytes(1, $start, $out, 0, $bufferSize - 1);
}
$bw.Close();
$fs.Close();
}
# Closing & Disposing all objects
$fs.Dispose();
$rd.Close();
$cmd.Dispose();
$con.Close();
Write-Output ("Finished");
From the errors I get it seems it's not picking up the correct overload for GetString, but I'm not familiar enough with Powershell to fix this. Can someone please point me in the right direction?
Exception calling "GetString" with "1" argument(s): "Unable to cast object of type 'System.Byte[]' to type 'System.String'."
At line:33 char:5
Exception calling "GetString" with "1" argument(s): "Unable to cast object of type 'System.Byte[]' to type 'System.String'."
At line:35 char:5
-
$fs = New-Object System.IO.FileStream ($Dest + $rd.GetString(0)), ...
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- CategoryInfo : NotSpecified: (:) [], MethodInvocationException
- FullyQualifiedErrorId : InvalidCastException
New-Object : A constructor was not found. Cannot find an appropriate constructor for type System.IO.BinaryWriter.
At line:36 char:11
You cannot call a method on a null-valued expression.
At line:43 char:8
-
$bw.Write($out, 0, $received);
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- CategoryInfo : InvalidOperation: (:) [], RuntimeException
- FullyQualifiedErrorId : InvokeMethodOnNull
question from:
https://stackoverflow.com/questions/65651881/windows-powershell-getstring-overload-problem 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…