Im new at C# programming and am trying to create a software that will allow the user to save information and a picture into a Ms access database. I have followed a tutorial on youtube and managed to store the info I needed and the picture but I cant seem to retrieve the image and display it in a picture box. can anyone help me?
My code is:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
namespace ConnectionApp
{
public partial class ClinicaPrivada : Form
{
OleDbConnection DBConnection = new OleDbConnection();
OleDbDataAdapter DataAdapter;
DataTable LocalDatatable = new DataTable();
int rowPosition = 0;
int rowNumber = 0;
public ClinicaPrivada()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ConnectToDatabase();
}
public void ConnectToDatabase()
{
DBConnection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ClinicaPrivada.mdb";
DataAdapter = new OleDbDataAdapter("Select * From Pacientes", DBConnection);
DataAdapter.Fill(LocalDatatable);
if (LocalDatatable.Rows.Count != 0)
{
rowPosition = LocalDatatable.Rows.Count;
}
}
public void RefreshDBConnection()
{
if (DBConnection.State.Equals(ConnectionState.Open))
{
DBConnection.Close();
LocalDatatable.Clear();
ConnectToDatabase();
}
}
private void btnBrowse_Click(object sender, EventArgs e)
{
}
public byte[] ConvertAndStoreToDB(Image InputImage)
{
Bitmap BmpImage = new Bitmap(InputImage);
MemoryStream Mystream = new MemoryStream();
BmpImage.Save(Mystream, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] ImageAsBytes = Mystream.ToArray();
return ImageAsBytes;
}
public void StoreToDB(byte[] ImageAsBytes)
{
string NrDoPaciente;
NrDoPaciente = Convert.ToString(txtNrdoPaciente.Text);
string Empresa;
Empresa = Convert.ToString(txtEmpresa.Text);
string DataDaConsutla;
DataDaConsutla = Convert.ToString(txtDatadaConsulta.Text);
if (DBConnection.State.Equals(ConnectionState.Closed))
DBConnection.Open();
try
{
MessageBox.Show("Saving Image at index:" + rowPosition.ToString());
OleDbCommand insert = new OleDbCommand("Insert Into Pacientes (NrDoPaciente, Empresa, DatadaConsulta, Document) VALUES('" + NrDoPaciente +"','" + Empresa + "','" + DataDaConsutla + "','" + "Document" + "')" , DBConnection);
OleDbParameter InsertParameter = insert.Parameters.AddWithValue("Docu", SqlDbType.Binary);
int rowsAffected = insert.ExecuteNonQuery();
MessageBox.Show("Data Stored successfully in " + rowsAffected.ToString() + "Row");
rowPosition++;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
MessageBox.Show(ex.StackTrace.ToString());
}
finally
{
RefreshDBConnection();
}
}
private Image ReadImageFromDB()
{
Image FetchedImg;
if (rowNumber >= 0)
{
byte[] FetchedImgBytes = (byte[])LocalDatatable.Rows[rowNumber]["Document"];
MemoryStream stream = new MemoryStream(FetchedImgBytes);
FetchedImg = Image.FromStream(stream);
return FetchedImg;
}
else
{
MessageBox.Show("There are no Images in the database yet. Please reconnect or add some images.");
return null;
}
}
private void btnBrowse_Click_1(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);
}
}
private void btnSave_Click_1(object sender, EventArgs e)
{
StoreToDB(ConvertAndStoreToDB(pictureBox1.Image));
}
private void btnDisplayAll_Click(object sender, EventArgs e)
{
RefreshDBConnection();
rowNumber = 0;
pictureBox2.Image = ReadImageFromDB();
btnNext.Enabled = true;
BtnPrevious.Enabled = true;
}
}
}
Create data table like: Table: Id int, Image OLE Object
then use this code to insert
Then, insert 'imagepath' into table of Image place
and retrieving imagepath from table and convert into image like below:
I think this may help you. Thank you
Your image in memory is likely going out of scope. This question is directly related, if I am correct.
You must make a copy of the image. Otherwise, your image is linked to the object that created it and when that object goes out of scope, your image data is lost.
I would expect you are getting exceptions from what you are trying to do.
BTW, I agree with the commenter who suggested avoiding MS Access. There are much better free options available to you.