参数对于通过 blob 从数据库访问图像无效

Posted

技术标签:

【中文标题】参数对于通过 blob 从数据库访问图像无效【英文标题】:Parameter is not valid for accessing image from database through blob 【发布时间】:2013-04-01 14:30:42 【问题描述】:

我正在 C# 桌面应用程序中创建项目。我想添加一些功能,比如当我从数据网格视图中选择行时,数据库中的图像会显示在图片框中。但是有一些错误,例如:

“参数无效”

我的代码是..

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        
            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            
                // display content
                string value1 = row.Cells[0].Value.ToString();
                string value2 = row.Cells[1].Value.ToString();
                label2.Text = value1;
                label4.Text = value2;

            //Display Image
            SqlConnection cn = new SqlConnection();
            string str = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\PROJECT\\NEW\\CASTING CALCULATING SYSTEM\\CASTING CALCULATING SYSTEM\\DB_CASTING.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True;";
            cn.ConnectionString = str;
            SqlCommand cmd = new SqlCommand ();
            cmd.Connection = cn;
            string strsql = "select image from EmpMaster WHERE Fname = '" +value2+ "'";
            cmd.CommandText = strsql ;
            cn.Open();
            SqlDataReader dr;

            try
            

              dr = cmd.ExecuteReader();
              if (dr.Read())
              
                 byte[] picarr = (byte[])dr["image"];
                 MemoryStream ms = new MemoryStream(picarr);
                 ms.Seek(0, SeekOrigin.Begin);
                 pictureBox1.Image = Image.FromStream(ms);
              
            
            catch (Exception ex)
            
               MessageBox.Show(ex.Message);
            
            finally
            
              cn.Close();
            
        

    

【问题讨论】:

更改查询以使用Parameters 使用语法cmd.Paramater.AddwithValue("@ParamName", Paramvale); 这将是value2 还有一个许多人会问的问题,那就是Have you stepped through the code with the Debugger 以及value1 & value1 的值是什么 也在你的代码中..你有SqlDataReader dr 你在哪里创建NEW Instance of SqlDataReader 更改该行以将其包裹在using() 或将其更改为SqlDataReader dr = new(SqlDataReader(); 也放入一些在我看来,将新创建的Object Instance 中的Dispose 的代码正确地写入try needs to be wrapped in a using() as well 之上的所有代码 DJ KRAZE 关于使用参数的观点很好。您似乎对当前代码的 SQL 注入漏洞持开放态度。 同意,参数 == 好,连接文本 == 不好 【参考方案1】:

这很可能是内存上限问题,请参阅this thread 了解示例。

所以这基本上是问题出在图像方面,而不是您的 SQL。可能和纯内存的原因不同,图片构造函数失败的原因有很多。

另外,DJ KRAZE 是对的,您需要对 SQL 查询做一些工作。作为最低使用参数(显着降低 SQL 注入攻击的风险)并将 SqlConnection 和 SqlDataReader 放入 using 块中以确保它们被正确处理。

【讨论】:

我试图创建位图,但创建位图失败。但是当我改变输入类型(在我存储为 jpeg 图像的数据库中)时,它们就没有输出了...... 我的第一个建议是将图像保存到磁盘并确认您正在从数据库中正确读取它。您是否确认存储的 BLOB 数据是正确的图像?我通常会创建一个链接到 BLOB 数据的小型 Crystal 报表,这样我就知道图像数据没问题。

以上是关于参数对于通过 blob 从数据库访问图像无效的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 从 blob 文件创建图像并在保持透明度的同时与另一个文件组合

Flutter 错误:无效参数:URI 文件中未指定主机:///null

参数实例 recId 对于请求的转换无效。错误码=-4461

是否可以从存储过程访问 Azure Blob?

如何处理 TypeORM 中的 blob 列

如何将 blob 图像从数据库转换为 html 图像 src