VB.Net 导出 SQL Server Varbinary 数据问题

问题描述 投票:0回答:1

我正在尝试从 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 vb.net
1个回答
0
投票

这里无需引入序列化。

要将原始二进制文件保存到 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)

因此,请注意我们如何将列数据拉入字节数组,然后将其写入/保存到磁盘。

© www.soinside.com 2019 - 2024. All rights reserved.