从 C# 应用程序检索 sql 图像时出错

Posted

技术标签:

【中文标题】从 C# 应用程序检索 sql 图像时出错【英文标题】:Getting error retrieving sql image from c# application 【发布时间】:2019-09-24 01:27:09 【问题描述】:

我在尝试加载和显示图像表时遇到错误:

data:image/jpg;base64,U3lzdGVtLkJ5dGVbXQ== '由于错误无法加载图像'

我的 SQL DB 有一个 FileName(nvarhcar) Content(image) 和 ContentType (nvarchar)

希望有人可以帮助我了解图像未显示的原因。谢谢

更新 c# 以加载图像

        protected void Page_Load(object sender, EventArgs e)
        
            if (Session["User"] == null)
                Response.Redirect("../Login.aspx");

            sqlcon.Open();
            SqlCommand cmd = sqlcon.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "SELECT * FROM BluePrints";

            cmd.ExecuteNonQuery();


            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            gvImages.DataSource = dt;
            gvImages.DataBind();

            sqlcon.Close();
        

        protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
        
            if (e.Row.RowType == DataControlRowType.DataRow)
            
                DataRowView dr = (DataRowView)e.Row.DataItem;
                string imageUrl = "data:image/jpg;base64," + 
                Convert.ToBase64String((byte[])dr["Content"]);
                (e.Row.FindControl("Image1") as Image).ImageUrl = imageUrl;
            
        
    

  <asp:GridView ID="gvImages" runat="server" AutoGenerateColumns="false" OnRowDataBound="OnRowDataBound" Height="192px" Width="915px">
    <Columns>
      <asp:BoundField DataField="ID" HeaderText="ID" />
      <asp:BoundField DataField="FileName" HeaderText="Name" />
      <asp:TemplateField HeaderText="Image">
        <ItemTemplate>
          <asp:Image ID="Image1" runat="server" />
        </ItemTemplate>
      </asp:TemplateField>
    </Columns>
  </asp:GridView>
  <div id="dialog" style="display: none">
  </div>
  <br />
  <br />
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">
  </script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.24/themes/start/jquery-ui.css" />
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.24/jquery- 
       ui.min.js"></script>
  <script type="text/javascript">
    $(function() 
      $("#dialog").dialog(
        autoOpen: false,
        modal: true,
        height: 600,
        width: 600,
        title: "Zoomed Image"
      );
      $("[id*=gvImages] img").click(function() 
        $('#dialog').html('');
        $('#dialog').append($(this).clone());
        $('#dialog').dialog('open');
      );
    );
  </script>
</asp:Content>

插入代码

protected void UploadButton_Click(object sender, EventArgs e)
    

        FileInfo fi = new FileInfo(FileUploadControl.FileName);
        byte[] documentContent = FileUploadControl.FileBytes;

        string name = fi.Name;

        if (FileUploadControl.HasFile)
        
            try
            
                if (FileUploadControl.PostedFile.ContentType == "image/jpeg")
                
                    if (FileUploadControl.PostedFile.ContentLength < 102400)
                    

                        StatusLabel.Text = "Upload status: File uploaded!";

                        using (SqlConnection sqlcon = new SqlConnection(con))
                        

                            sqlcon.Open();
                            SqlCommand cmd = sqlcon.CreateCommand();
                            cmd.CommandType = CommandType.Text;
                            cmd.CommandText = "INSERT INTO BluePrints (ID_Dev, PlotID, FileName, Content) VALUES  (' " + DropDownList1.SelectedValue + " ', '" + DropDownList2.SelectedValue + "', '" + name + "', '" + documentContent + "')";

                            cmd.ExecuteNonQuery();
                        
                    

                    else
                        StatusLabel.Text = "Upload status: The file has to be less than 100 kb!";
                
                else
                    StatusLabel.Text = "Upload status: Only JPEG files are accepted!";

            
            catch (Exception ex)
            
                StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message;
            

        

【问题讨论】:

错误是什么? ''data:image/jpg;base64,U3lzdGVtLkJ5dGVbXQ=='' 无法显示,因为它包含错误。 当我加载页面时,有一个小图像图标,当我右键单击并在另一个选项卡中查看时,我会在黑色背景上收到它。 尝试使用正确的内容类型:image/jpeg。参见例如here... 刚刚尝试过,得到同样的错误,但只是 jpeg 而不是 jpg 【参考方案1】:

问题是U3lzdGVtLkJ5dGVbXQ== 解码是System.Byte[] 而不是任何应该是图像的东西。

换句话说,显示数据的代码可能没问题。相反,您在数据库中的数据是无效的。它应该是实际的字节数组,而不是表示它是字节数组的字符串。

【讨论】:

我添加了插入代码,你能帮我看看吗 代码不正确且不安全。您应该始终使用parametrized queries。 byte[] 参数应该像this 一样添加。

以上是关于从 C# 应用程序检索 sql 图像时出错的主要内容,如果未能解决你的问题,请参考以下文章

错误 java.sql.SQLException:从数据库中检索 Blob(图像)时 SQLite JDBC 驱动程序未实现

从firebase检索图像以在片段中的回收器视图时出错

在 Nativescript App 中调整从 URL 接收到的图像大小时出错

从 Oracle 10g 检索 CLOB 时出错

将 DATETIME 从 SQLite 解析为 java.SQL.Timestamp 时出错

从 C# 检索 SQL Server 扩展属性