【问题标题】:C# Select all Images from SQL table into all pictureboxesC#从SQL表中选择所有图像到所有图片框
【发布时间】:2019-04-01 20:52:47
【问题描述】:

我想使用 SQL 中的代码:SELECT * FROM USERS 此表包含图像,我想将所有图像应用于每个用户。 我正在使用用户控件,每个用户控件都有用户详细信息、姓名、姓氏和图像。

我试图从我的表格中填充图像,但我在所有用户控件图片框中都得到了相同的图像。

    private void populateItems()
    {
        string query = "SELECT * FROM Users";
        {
            using (SqlDataAdapter sda = new SqlDataAdapter(query, con))
            {
                //Fill the DataTable with records from Table.
                DataTable dt = new DataTable();
                sda.Fill(dt);

                //Loop and add SelectUser:Usercontrol to FloyLayoutPanel.
                foreach (DataRow row in dt.Rows)
                {
                    SelectContacts contact = new SelectContacts();
                    contact.FirstName = row["FirstName"].ToString();
                    contact.LastName = row["LastName"].ToString();
                    contact.Title = row["Title"].ToString();

                    byte[] img = (byte[])dt.Rows[0]["Image"];
                    MemoryStream ms = new MemoryStream(img);
                    contact.PublicProfilePic = Image.FromStream(ms);

                    flowUsers.Controls.Add(contact);
                }
            }
        }
    }

它应该向我展示与用户相关的不同图片。 但相反,我在所有图片框中获得了第一个可用图像。

如何针对单个用户填充单个图像?

【问题讨论】:

    标签: c# image populate


    【解决方案1】:

    在 for-each 循环中,您不是获取相应的行(用户)图像,而是为所有其余部分获取第一个用户的图像。 在每次迭代中取row["image"] NOT dt.Rows[0]["Image"]

    对于空值检查,可以使用以下经典方式

    object value = row["Image"];
        if (value == DBNull.Value)
        {
    
        }
        else
        {
        }
    

    或使用三元运算符。

    int? myValue = (Convert.IsDBNull(row["column"]) ? null : (int?) Convert.ToInt32(row["column"]));
    

    【讨论】:

    • 如果你发现它的工作使我的回答被接受。
    【解决方案2】:

    而不是使用

    dt.Rows[0]["Image"]
    

    用途:

    row["Image"]
    

    目前,您只能访问结果中第一行的图像。上面的更改将为您提供每一行。

    【讨论】:

      【解决方案3】:

      下面一行中的0 是罪魁祸首。

      byte[] img = (byte[])dt.Rows[0]["Image"];
      

      使用

      byte[] img = (byte[])row["Image"];
      

      【讨论】:

      • 你能告诉我怎么做吗?我不太擅长 C# 中的图像
      【解决方案4】:

      您只是在这里收集第一张图片:

      byte[] img = (byte[])dt.Rows[0]["Image"];

      把那行代码改成

      byte[] img = (byte[])row["Image"];

      还有很多方法可以避免空错误:

      // Using "as" keyword is the best practice only
      // in case you are doing null check after the cast
      byte[] img = row["Image"] as byte[];
      // OR the following will either give you the image or an empty byte array.
      byte[] img = row["Image"] as byte[] ?? new byte[];
      

      但始终记得检查空值,以免遇到任何错误。

      完整的代码如下所示:

      private void populateItems()
      {
          string query = "SELECT * FROM Users";
          {
              using (SqlDataAdapter sda = new SqlDataAdapter(query, con))
              {
                  //Fill the DataTable with records from Table.
                  DataTable dt = new DataTable();
                  sda.Fill(dt);
      
                  //Loop and add SelectUser:Usercontrol to FloyLayoutPanel.
                  foreach (DataRow row in dt.Rows)
                  {
                      SelectContacts contact = new SelectContacts();
                      contact.FirstName = row["FirstName"].ToString();
                      contact.LastName = row["LastName"].ToString();
                      contact.Title = row["Title"].ToString();
      
                      byte[] img = row["Image"] as byte[];
      
                      if(img != null && img.length > 0)
                      {
                          MemoryStream ms = new MemoryStream(img);
                          contact.PublicProfilePic = Image.FromStream(ms);
                      }
      
                      flowUsers.Controls.Add(contact);
                  }
              }
          }
      }
      

      【讨论】:

      • 很好,但我怎样才能允许空值?在 SQL 中我允许空值,但在应用程序中我得到了这个。无法将 system.dbnull 类型的对象转换为 system.byte[] 类型
      • 为您更新。
      • 问号是意外吗?它不能用它,如果我把它取下来,我会得到这个。 “System.ArgumentNullException:缓冲区不能为空。参数名称:缓冲区。”
      • 您使用的是什么 .net 框架?您应该可以只使用第一个。
      【解决方案5】:

      这是因为你从这里的 rows 对象中获取第一行

      byte[] img = (byte[])dt.Rows[0]["Image"];
      

      由于您允许在数据库中使用 null,请尝试这样的操作,

      if(!Convert.IsDBNull(row["Image"])) { 
         byte[] img = (byte[])row["Image"];                     
         MemoryStream ms = new MemoryStream(img);
         contact.PublicProfilePic = Image.FromStream(ms);
      }
      

      【讨论】:

      • 还是同样的错误。无法转换类型的对象。 System.DBNull。输入 System.Byte[] 并在这个阶段出现: byte[] img = (byte[])row["Image"];
      • 尝试在 if 语句中添加 !Convert.IsDBNull(row["Image"]),我已经为您编辑了代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2016-01-20
      • 1970-01-01
      相关资源
      最近更新 更多