【问题标题】:Parameter is not valid exception in c#参数在c#中是无效异常
【发布时间】:2016-09-10 07:53:17
【问题描述】:

我编写了以下代码,将图片从数据库传递到 c# 中的图片框。我从 microsoft 获得此代码。这是该页面的 url。Microsoft

当我运行这段代码时,它的显示参数是无效异常。

这段代码有什么问题?

private void button2_Click(object sender, EventArgs e)
{
    try
    {
        String strCn =@"Data Source=DESKTOP-ROF2H0M\BHAGI;Initial Catalog=Golden;Integrated Security=True";

        SqlConnection cn = new SqlConnection(strCn);
        cn.Open();


        //Retrieve BLOB from database into DataSet.
        SqlCommand cmd = new SqlCommand("SELECT User_id ,img FROM login", cn);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds, "login");
        int c = ds.Tables["login"].Rows.Count;


        if (c > 0)
        {   //BLOB is read into Byte array, then used to construct MemoryStream,
            //then passed to PictureBox.
            Byte[] byteBLOBData = new Byte[0];
            byteBLOBData = (Byte[])(ds.Tables["login"].Rows[c-1]["img"]);
            MemoryStream stmBLOBData = new MemoryStream(byteBLOBData);
            pictureBox1.Image = Image.FromStream(stmBLOBData);
        }
        cn.Close();

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

我收到以下错误消息。

“System.ArgumentException”类型的未处理异常发生在 System.Drawing.dll

附加信息:参数无效。

这是我的数据库的快照。 LOgin Table

【问题讨论】:

  • 你能分享更多关于display parameter is not valid exception的信息
  • @ThomasAyoub 这是我收到的错误消息=> System.Drawing.dll 中发生了“System.ArgumentException”类型的未处理异常附加信息:参数无效。
  • 当提供给PictureBox 的图像无效时,通常会给出此错误消息。首先将字节数组保存到文件中(作为调试步骤)以确认图像有效;可能不会。
  • 二进制blob的数据格式是什么?它是如何产生的?
  • 你的方法不好,你的 sql 连接没有正确处理

标签: c# sql ado.net


【解决方案1】:

您有 3 个问题(性能和安全问题):

  1. 你需要处理SQL连接
  2. 您需要将文件(二进制和图像)存储在磁盘上(无数据库)
  3. 永远不要尝试在未加密的情况下存储用户密码(如 MD5)

private void button2_Click(object sender, EventArgs e)
{           
    string strCn = @"Data Source=DESKTOP-ROF2H0M\BHAGI;Initial Catalog=Golden;Integrated Security=True";
        using (var cn = new SqlConnection(strCn))
        {
            try
            {
                cn.Open();
                using (var cmd = new SqlCommand("SELECT User_id ,imgUrlOnDisk FROM login", cn))
                {
                    using (var dr = cmd.ExecuteReader())
                    {
                        if (dr.HasRows)
                        {
                            if (dr.Read())
                            {
                                pictureBox1.Image = Image.FromFile(Convert.ToString(dr["imgUrlOnDisk"]));
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (cn.State != ConnectionState.Closed)
                {
                    cn.Close();
                }
            }
        }
}

我建议您使用 ADO.net 查询的最佳方式是:

try
{
     using (SqlCommand cmd = new SqlCommand(Query, Connection))
     {
          try
          {
               cmd.CommandType = CommandType;
               foreach (var p in InParameters)
               {
                    cmd.Parameters.Add(p);
               }
               cmd.Connection.Open();
               affectedRows = cmd.ExecuteNonQuery();
               if (affectedRows == 0)
               {
                    //Zero Record Success
               }
               else
               {
                   if (affectedRows > 1)
                   {
                        //Many Record Success
                   }
                   else
                   {
                        //One Record Success
                   }
               }
           }
           catch (Exception InnerEx)
           {
                //Handle your error
           }
           finally
           {
               if (cmd.Connection.State != ConnectionState.Closed)
               {
                   cmd.Connection.Close();
               }
           }
      }
}

【讨论】:

  • using 声明会更简洁。此外,您还使用了其他未正确处理的实现 IDisposable 的对象。
  • @Dai 关于其他对象的使用,你是对的,但是使用它与我的代码没有什么不同
  • 能不能告诉我你表的数据,我帮你测试一下
  • @ImranShams 创建表登录(User_id CHAR(7)、user_name VARCHAR(15)、密码 VARCHAR(20)、img IMAGE)
  • 我需要一个img列的例子,另外你又犯了一个错误,永远不要尝试将文件和图像存储在数据库中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2012-02-20
相关资源
最近更新 更多