C#从SQL表中选择所有图像到所有图片框中

时间:2019-04-01 11:52:51

标签: c# image populate

我想使用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);
                }
            }
        }
    }

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

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

5 个答案:

答案 0 :(得分:0)

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

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);
            }
        }
    }
}

答案 1 :(得分:0)

下一行中的0是元凶。

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

使用

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

答案 2 :(得分:0)

代替使用

dt.Rows[0]["Image"]

使用:

row["Image"]

目前,您仅从结果的第一行访问图像。上面的更改将为您提供每一行的信息。

答案 3 :(得分:0)

这是因为您要从这里的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);
}

答案 4 :(得分:0)

在for-each循环内,而不是获取相应的row(user)图像,您将获取其余所有第一个用户的图像。 在每次迭代中,请使用row["image"]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"]));