PDA

View Full Version : اشکال در ذخیره کردن عکس در دیتابیس



oracler
چهارشنبه 10 شهریور 1389, 03:16 صبح
با سلام
من برای ذخیره عکس در دیتابیس و بازخوانی اون از دستورالعمل زیر استفاده کردم:

شما برای ذخیره عکس باید در جدولتون دو تا فیلد تعریف کنید یکیش از نوع nvarchar با حداقل 200 کاراکتر که مسیر رو ذخیره میکنه ویکیش از نوع image که عکس رو به صورت باینری ذخیره میکنه.
حال یک متد به صورت زیر تعریف کنید و در کلاس فرمتون بزارید:

byte[] ReadFile(string sPath)
{
byte[] data = null;
FileInfo fInfo = new FileInfo(sPath);
long numBytes = fInfo.Length;
FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fStream);
data = br.ReadBytes((int)numBytes);
return data;
}

حالا یک کنترل picturebox بزارید و یه دکمه بزارید با استفاده از openfiledialog عکستون رو از روی هارد بخونید و در یک کنترل image نشون بدید این هم کدش:

private void openfile_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "text file (*.jpg)|*.jpg|all files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strfilename = openFileDialog1.FileName;
pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);
}

}

یادتون باشه که strfilenameرا به صورت private در کلاس فرمتون تعریف کنید به صورت زیر:
private string strfilename;
حالا یه دکمه بزارید که کار ذخیره کردن رو انجام بده به صورت زیر:
یادتون باشه که ImageOriginalPath همون فیلد بانکتونه که مسیر رو ذخیره میکنه و ImageData هم عکس رو به صورت بایناری ذخیره میکنه

private void savefile_Click(object sender, EventArgs e)
{
try
{
byte[] imageData = ReadFile(strfilename);
SqlConnection objConnection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + "\\testimage.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
SqlCommand objCommand = new SqlCommand();
objCommand.Connection = objConnection;
objCommand.CommandText = "INSERT INTO t1 (ImageOriginalPath, ImageData)VALUES(@ImageOriginalPath, @ImageData)";
objCommand.Parameters.Add(new SqlParameter("@ImageOriginalPath", (object)strfilename));
objCommand.Parameters.Add(new SqlParameter("@ImageData", (object)imageData));
objConnection.Open();
objCommand.ExecuteNonQuery();
MessageBox.Show("saved");
objConnection.Close();
}
catch (Exception msg)
{
MessageBox.Show("error" + msg.Message);
}
}

حالا توی فرم لودتون کد های زیر رو برای نشون دادن تو گرید بنویسید:

String connectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + "\\testimage.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlConnection con = new SqlConnection(connectionString);
con.Open();
string strquery = "select imagedata from t1";
SqlDataAdapter da = new SqlDataAdapter(strquery, con);
DataSet ds = new DataSet();
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
con.Close();

من دقیقا طبق بالا عمل کردم و پیغام ثبت رکورد در دیتابیس را داد ولی هنگامی که میخوام عکس را از دیتابیس بخونم و نمایش بدم فیلد مربوط به عکس اصلا در گریدویونمایش داده نمیشه.(پیغام خطا هم نمیده)
فکر میکنید اشکال از کجاست؟
بابت توجهتون متشکرم:لبخندساده:

mahdi_7610
چهارشنبه 10 شهریور 1389, 10:43 صبح
سلام

Form_load را به صورت زیر تغییر بدید


private void Form1_Load(object sender, EventArgs e)
{
con = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|\\testimage.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
string strquery = "select imagedata from t1";
cmd = new SqlCommand(strquery, con);
sda = new SqlDataAdapter(cmd);
ds = new DataSet();
con.Open();
sda.Fill(ds, "t1");
con.Close();
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "t1";
}

دکمه Save را هم به صورت زیر تغییر بدید


private void save_Click(object sender, EventArgs e)
{
try
{
byte[] imageData = ReadFile(strfilename);
con = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|\\testimage.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
con.Open();
cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO t1 (ImageOriginalPath, ImageData)VALUES(@ImageOriginalPath, @ImageData)";
cmd.Parameters.Add(new SqlParameter("@ImageOriginalPath", (object)strfilename));
cmd.Parameters.Add(new SqlParameter("@ImageData", (object)imageData));
cmd.ExecuteNonQuery();
ds.Clear();
sda.Fill(ds, "t1");
MessageBox.Show("saved");
con.Close();
}
catch (Exception msg)
{
MessageBox.Show("error" + msg.Message);
}
}

oracler
چهارشنبه 10 شهریور 1389, 11:56 صبح
متشکرم ولی مشکلم حل نشد. اضافه کردن رکورد بدرستی انجام میشه و موقع نمایش تمامی فیلدها نمایش داده میشن غیر از ImageData .
از دوستان دیگه هم خواهش میکنم کمک کنن:افسرده:

javad_r_85
چهارشنبه 10 شهریور 1389, 12:27 عصر
اگر می شه برای اکسس هم توضیح دهید؟؟؟؟؟