net - guardar imagen en mysql c#
¿Muestre la imagen de la base de datos a la caja de imágenes de cada usuario? (3)
Código de control de usuario:
private string lastName;
public string LastName
{
get { return lastName; }
set
{
lastName = value;
textBox1.Text = value;
}
}
Código de formulario:
using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString))
{
myDatabaseConnection.Open();
using (SqlCommand SqlCommand = new SqlCommand("Select LastName, Image from Employee", myDatabaseConnection))
{
int i = 0;
SqlDataReader DR1 = SqlCommand.ExecuteReader();
while (DR1.Read())
{
i++;
UserControl2 usercontrol = new UserControl2();
usercontrol.Tag = i;
usercontrol.LastName = (string)DR1["LastName"];
flowLayoutPanel1.Controls.Add(usercontrol);
}
}
}
Con el código anterior, puedo mostrar cada Apellido desde la base de datos en el cuadro de texto de cada control de usuario. ¿Cómo mostrar la imagen desde la base de datos a la caja de imágenes de cada usuario?
Así es como muestro una sola imagen desde la base de datos:
using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString))
{
myDatabaseConnection.Open();
using (SqlCommand SqlCommand = new SqlCommand("Select LastName, Image from Employee where ID = @a", myDatabaseConnection))
{
SqlCommand.Parameters.AddWithValue("@a", textBox1.Text);
DataSet DS = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(SqlCommand);
da.Fill(DS, "Images");
var imagesTable = DS.Tables["Images"];
var imagesRows = imagesTable.Rows;
var count = imagesRows.Count;
if (count <= 0)
return;
var imageColumnValue =
imagesRows[count - 1]["Image"];
if (imageColumnValue == DBNull.Value)
return;
var data = (Byte[])imageColumnValue;
using (var stream = new MemoryStream(data))
{
pictureBox1.Image = Image.FromStream(stream);
}
}
}
Código de control de usuario:
public void showpictures()
{
{
using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString))
{
myDatabaseConnection.Open();
using (SqlCommand SqlCommand = new SqlCommand("Select LastName, Image from Employee where LastName = @a", myDatabaseConnection))
{
SqlCommand.Parameters.AddWithValue("@a", textBox1.Text);
DataSet DS = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(SqlCommand);
da.Fill(DS, "Images");
var imagesTable = DS.Tables["Images"];
var imagesRows = imagesTable.Rows;
var count = imagesRows.Count;
if (count <= 0)
return;
var imageColumnValue =
imagesRows[count - 1]["Image"];
if (imageColumnValue == DBNull.Value)
return;
var data = (Byte[])imageColumnValue;
using (var stream = new MemoryStream(data))
{
pictureBox1.Image = Image.FromStream(stream);
}
}
}
}
}
Formar
while (DR1.Read())
{
i++;
UserControl2 usercontrol = new UserControl2();
usercontrol.Tag = i;
usercontrol.LastName = (string)DR1["LastName"];
usercontrol.showpictures();
flowLayoutPanel1.Controls.Add(usercontrol);
}
Cree una sobrecarga para que su constructor UserControl reciba tanto el apellido como los bytes de la imagen. Entonces puedes hacer esto en tu ciclo:
while (DR1.Read())
{
i++;
UserControl2 usercontrol = new UserControl2((string)DR1["LastName"], (Byte[])DR1["Image"]);
usercontrol.Tag = i;
flowLayoutPanel1.Controls.Add(usercontrol);
}
Aquí está el UserControl actualizado (con el código InvokeOnClick () de su otra pregunta). Tenga en cuenta en el nuevo constructor cómo estamos creando una imagen desde los bytes y asignándola al PictureBox:
public partial class UserControl2 : UserControl
{
private string lastName;
public string LastName
{
get { return lastName; }
set
{
lastName = value;
textBox1.Text = value;
}
}
public UserControl2(string LastName, byte[] data)
{
InitializeComponent();
WireAllControls(this);
this.LastName = LastName;
try
{
using (var stream = new System.IO.MemoryStream(data))
{
pictureBox1.Image = Image.FromStream(stream);
}
}
catch (Exception)
{
MessageBox.Show("Error Loading Image for " + LastName);
}
}
public UserControl2()
{
InitializeComponent();
WireAllControls(this);
}
private void WireAllControls(Control cont)
{
foreach (Control ctl in cont.Controls)
{
ctl.Click += ctl_Click;
if (ctl.HasChildren)
{
WireAllControls(ctl);
}
}
}
private void ctl_Click(object sender, EventArgs e)
{
this.InvokeOnClick(this, EventArgs.Empty);
}
}
Para acceder a múltiples controles a la vez (PictureBoxes en su caso) use foreach
loop.
foreach (Control control in this.Controls)
{
if (control is PictureBox)
{
PictureBox pic = (PictureBox)control;
pic.Image = Image.FromStream(stream); //something similar, this will only load the same image to every PictureBox
}
}