我正在尝试从 SQL Server 表导出 varbinary 数据并将其保存到磁盘。我可以使用 T-SQL 脚本导出它,但是当我尝试使用 VB.NET 代码时,应用程序会在文件的前端和末尾添加垃圾字符。
对于 T-SQL,我使用以下脚本:
EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instance created
EXEC sp_OASetProperty @init, 'Type', 1;
EXEC sp_OAMethod @init, 'Open'; -- Calling a method
EXEC sp_OAMethod @init, 'Write', NULL, @VarBinaryData; -- Calling a method
EXEC sp_OAMethod @init, 'SaveToFile', NULL, @FilePath, 2; -- Calling a method
EXEC sp_OAMethod @init, 'Close'; -- Calling a method
EXEC sp_OADestroy @init; -- Closed the resources
对于 VB.NET 代码,我使用:
Dim _MemoryStream As New System.IO.MemoryStream()
Dim _BinaryFormatter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
_BinaryFormatter.Serialize(_MemoryStream, aRow("VarBinaryData"))
_MemoryStream.ToArray()
File.WriteAllBytes("C:\Temp\NG Annotation\" + aRow("page_id").ToString() + ".art", _MemoryStream.ToArray())
使用 SQL 代码时,文件如下所示
这是错误文件(我突出显示了多余的字符)
如何防止 VB 代码添加额外的字符?
这里无需引入序列化。
要将原始二进制文件保存到 SQL Server 中的一行中,请使用以下代码:
Using con As New SqlConnection(My.Settings.TEST4)
Dim strSQL As String =
"INSERT INTO MyFiles (Filename, BFile)
VALUES (@FileName, @BFILE)"
Using cmdSQL As New SqlCommand(strSQL, con)
Dim bFile As Byte()
bFile = File.ReadAllBytes(txtFromFile.Text)
cmdSQL.Parameters.Add("@FileName", SqlDbType.NVarChar).Value = txtFromFile.Text
cmdSQL.Parameters.Add("@BFILE", SqlDbType.Binary).Value = bFile
con.Open()
cmdSQL.ExecuteNonQuery()
cmdSQL.CommandText = "SELECT @@IDENTITY"
txtID.Text = cmdSQL.ExecuteScalar ' put new PK id in text box
End Using
End Using
要从数据库获取并保存原始二进制文件,可以使用以下代码:
Dim strSQL As String =
"SELECT ID, BFile FROM MyFiles WHERE ID = @ID"
Dim rstData As New DataTable
Using conn As New SqlConnection(My.Settings.TEST4)
Using cmdSQL As New SqlCommand(strSQL, conn)
cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = txtID.Text
conn.Open()
rstData.Load(cmdSQL.ExecuteReader)
End Using
End Using
Dim bFile As Byte() = rstData.Rows(0)("Bfile")
File.WriteAllBytes(txtSaveFile.Text, bFile)
因此,请注意我们如何将列数据拉入字节数组,然后将其写入/保存到磁盘。