C # выбрать все изображения из таблицы SQL во все поля изображения - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу использовать код из 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 голосов
/ 01 апреля 2019

Внутри цикла for-each вместо того, чтобы брать соответствующее изображение строки (пользователя), вы выбираете изображение первого пользователя для всех остальных. В каждой итерации берут 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"]));
0 голосов
/ 01 апреля 2019

Это потому, что вы получаете первую строку из объекта row здесь

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);
}
0 голосов
/ 01 апреля 2019

0 в строке ниже является виновником.

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

использовать

byte[] img = (byte[])row["Image"];
0 голосов
/ 01 апреля 2019

Вместо использования

dt.Rows[0]["Image"]

Использование:

row["Image"]

В данный момент вы получаете доступ к изображению только из первого ряда ваших результатов. Изменение, приведенное выше, даст вам его для каждой строки.

0 голосов
/ 01 апреля 2019

Вы просто собираете первое изображение здесь:

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