我想使用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);
}
}
}
}
它应该向我显示与用户相关的不同图片。 但是相反,我在所有图片框中都获得了第一个可用的图像。
如何针对单个用户填充单个图像?
答案 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"]));