【问题标题】:InvalidCastException when reading a BLOB object (PDF File) from an SQL Database从 SQL 数据库读取 BLOB 对象(PDF 文件)时出现 InvalidCastException
【发布时间】:2011-11-24 05:21:20
【问题描述】:

当我尝试将数据库中的 PDF 作为 BLOB 读取时,我遇到了无效转换异常的问题。我可以将文件写入数据库完全没有问题,但是,当我尝试检索它们时,我只是得到 InvalidCastException。

这是我正在使用的代码:

Protected Sub btnPDF_Click(sender As Object, e As EventArgs) Handles btnPDF.Click
    ' Request.QueryString["docid"].ToString();
    Dim docuid As String = "b39a443d-ccfd-47f4-b333-f12cd94683d6"
    'Connection and Parameters
    Dim param As SqlParameter = Nothing
    Dim conn As SqlConnection = New SqlConnection(
       ConfigurationManager.ConnectionStrings("menu").ToString())
    Dim cmd As New SqlCommand("sp_getdoc", conn)
    cmd.CommandType = CommandType.StoredProcedure
    param = New SqlParameter("@docuid", SqlDbType.NVarChar, 100)
    param.Direction = ParameterDirection.Input
    param.Value = docuid
    cmd.Parameters.Add(param)
    'Open connection and fetch the data with reader
    conn.Open()
    Dim reader As SqlDataReader =
      cmd.ExecuteReader(CommandBehavior.CloseConnection)
    If reader.HasRows Then
        reader.Read()
        '
        Dim doctype As String = reader("doctype").ToString()
        Dim docname As String = reader("docname").ToString()
        '
        Response.Buffer = False
        Response.ClearHeaders()
        Response.ContentType = doctype
        Response.AddHeader("Content-Disposition",
                 "attachment; filename=" + docname)
        '
        'Code for streaming the object while writing
        Const ChunkSize As Integer = 1024
        Dim buffer() As Byte = New Byte(ChunkSize) {}
        Dim binary(reader("document")) As Byte
        Dim ms As New MemoryStream(binary)
        Dim SizeToWrite As Integer = ChunkSize
        For i As Integer = 0 To binary.GetUpperBound(0) - 1 Step i = i + ChunkSize
            If Not Response.IsClientConnected Then
                Return
            End If
            If i + ChunkSize >= binary.Length Then
                SizeToWrite = binary.Length - i
            End If
            Dim chunk(SizeToWrite) As Byte
            ms.Read(chunk, 0, SizeToWrite)
            Response.BinaryWrite(chunk)
            Response.Flush()
        Next
        Response.Close()
    End If
End Sub

我在下面一行遇到了这个问题:

Dim binary(reader("document")) As Byte

似乎认为二进制正在传递一个整数。这与 SQLReader 有关吗?我现在不确定问题是什么。

任何帮助将不胜感激。

非常感谢,

理查德·E·洛根-贝克

*更新*

我已经解决了我遇到的问题,方法是:

Dim blob() As Byte
        blob = reader.Item("document")

但是,PDF 不显示在 firefox 中,当我保存文件时(尽管我的数据库只有 2MB~),下载超过 40MB 的数据非常高兴!此外,文件大小报告为未知。我现在真的卡住了。

*更新*

我现在可以在浏览器中打开 PDF,但没有显示任何数据,Adobe Acrobat 说从文件中提取文本/字体时遇到问题,并且 PDF 以某种方式损坏。

这是我现在更新的代码:

Protected Sub btnPDF_Click(sender As Object, e As EventArgs) Handles btnPDF.Click
    ' Request.QueryString["docid"].ToString(); 
    Dim docuid As String = "ba32bf45-1b5c-451a-969c-290dc2cf9073"
    'Connection and Parameters
    Dim param As SqlParameter = Nothing
    Dim conn As SqlConnection = New SqlConnection(
       ConfigurationManager.ConnectionStrings("menu").ToString())
    Dim cmd As New SqlCommand("sp_getdoc", conn)
    cmd.CommandType = CommandType.StoredProcedure
    param = New SqlParameter("@docuid", SqlDbType.NVarChar, 100)
    param.Direction = ParameterDirection.Input
    param.Value = docuid
    cmd.Parameters.Add(param)
    'Open connection and fetch the data with reader
    conn.Open()
    Dim reader As SqlDataReader =
      cmd.ExecuteReader(CommandBehavior.CloseConnection)
    If reader.HasRows Then
        reader.Read()
        '
        Dim doctype As String = reader("doctype").ToString()
        Dim docname As String = reader("docname").ToString()
        '
        Response.Buffer = False
        Response.ClearHeaders()
        Response.ContentType = doctype
        Response.AddHeader("Content-Disposition",
                "attachment; filename=" + docname)
        '
        'Code for streaming the object while writing
        Const ChunkSize As Integer = 1024
        Dim buffer() As Byte = New Byte(ChunkSize) {}
        Dim blob() As Byte
        blob = reader.Item("document")
        Dim ms As New MemoryStream(blob)
        Dim SizeToWrite As Integer = ChunkSize
        For i As Integer = 0 To blob.GetUpperBound(0) - 1
            If Not Response.IsClientConnected Then
                Return
            End If
            If i + ChunkSize >= blob.Length Then
                SizeToWrite = blob.Length - i
            End If
            Dim chunk(SizeToWrite) As Byte
            ms.Read(chunk, 0, SizeToWrite)
            Response.BinaryWrite(chunk)
            Response.Flush()
            i = i + ChunkSize
        Next i
        Response.Close()
    End If
End Sub

【问题讨论】:

    标签: asp.net vb.net


    【解决方案1】:

    我认为您的问题来自您在循环内递增“i”的方式。在 For...Next 语句末尾将其增加 ChunkSize 后,“Next i”语句将再次将其增加 1。尝试将该行更改为:

    i = i + ChunkSize - 1
    

    或者,您可以在 For 语句的末尾添加“Step ChunkSize”并删除我所指的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多