PDA

View Full Version : ذخیره یک فایل Jpeg درون بانک SQL



مهدی رحیم زاده
جمعه 07 تیر 1387, 12:47 عصر
سلام
من یه Table دارم که یه فیلدی از نوع Image داره . میخوام از طریق برنامم عکس یک PictureBox رو توی بانک ذخیره کنم ، اما نمیشه !!!!!
چطوری باید درستش کنم ؟؟؟؟؟؟
ممنون

sahmah65
جمعه 07 تیر 1387, 14:21 عصر
کدی که خودم توی یکی از برنامه هام استفاده کردم.خودت زحمت تغییراتش رو بکش!

private void btnSaveImage_Click(object sender, EventArgs e)
{

try
{
int intposition;
intposition = ObjCurrencyManager.Position;
MemoryStream MemSt = new MemoryStream();
pictureBox1.Image.Save(MemSt, pictureBox1.Image.RawFormat);
byte[] arrpic = MemSt.GetBuffer();
MemSt.Close();
SqlCommand ObjCommand = new SqlCommand();
ObjCommand.Connection = ObjConection;
ObjCommand.CommandText = "AddImage";
ObjCommand.CommandType = CommandType.StoredProcedure;
ObjCommand.Parameters.Add("@picture", SqlDbType.VarBinary).Value = arrpic;
ObjCommand.Parameters.AddWithValue("@SNO", txtSNO.Text);
//

ObjConection.Open();
ObjCommand.ExecuteNonQuery();

ObjConection.Close();
FillDataSetAndView(); //baste be porozhe bayad tarif beshe ya nashe
BindFields(); //baste be porozhe bayad tarif beshe ya nashe
ObjCurrencyManager.Position = intposition;

lblStatus.Text = "عکس با موفقیت ذخیره شد ";
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
}



این هم مال Binding


pictureBox1.DataBindings.Add(new System.Windows.Forms.Binding("Image", ObjDataView, "Picture", true));

bachebahal_1363
شنبه 08 تیر 1387, 07:33 صبح
یک سوال در این زمینه
اگر کاربر عکسی برای ذخیره انتخاب نکرد برنامه Error می ده . به چه صورت می شه از اون جلوگیری کرد ؟

ali_kashani
شنبه 08 تیر 1387, 09:00 صبح
سلام
به اين پست يه نگاه بكن
http://barnamenevis.org/forum/showthread.php?p=539724#post539724

مهدی رحیم زاده
شنبه 08 تیر 1387, 11:15 صبح
سلام
من این کدو نوشتم اما جواب نمیده و اشکال میگیره :

MemoryStream MS = new MemoryStream();
pictureBox1.Image.Save(MS, pictureBox1.Image.RawFormat);
byte[] arrpic = MS.GetBuffer();
MS.Close();
ide("insert into MyTestTable(Id,Pic) values(" + textBox1.Text + "," + arrpic + ")");

و با این تابع Command رو اجرا می کنم :

void ide(string command)//ide = Insert , Delete , Edit
{
connect.Open();
SqlCommand sc = new SqlCommand(command, connect);
sc.ExecuteNonQuery();
connect.Close();
}
//

چکار کنم که درست بشه ؟؟؟؟؟؟

top7news
دوشنبه 10 تیر 1387, 10:14 صبح
سلام دوست عزیز
من برنامه خودم رو تو سایت گذاشتم یه بار که صد در صد هم جواب میده ،

اینم لینکش :
http://rapidshare.com/files/126005493/Picture_Saveing.rar
در مورد سئوال دوست عزیز bachebahal برای اینکه اگه عکسی نبود خطا نده هم شما یه عکس default برای picture box تعریف میکنی ، اگه عکس جدید خواستی که از مسیر مربوط میاری ، اگه هم نه که همون عکس پیش فرض تو بانک ذخیره میشه .

gdevnb
دوشنبه 10 تیر 1387, 11:54 صبح
سلام دوست عزیز
در مورد سئوال دوست عزیز bachebahal برای اینکه اگه عکسی نبود خطا نده هم شما یه عکس default برای picture box تعریف میکنی ، اگه عکس جدید خواستی که از مسیر مربوط میاری ، اگه هم نه که همون عکس پیش فرض تو بانک ذخیره میشه .
سلام top7news عزیز
به جای اینکه حجم db رو الکی زیاد کنی از tag کنترلت استفاده کن. زمانی که عکسی انتخاب نشده اونو null ش کن , در غیر اینصورت بهش یه مقداری بده .
عکس default رو تو db ذخیره نکن . کنار یا تو خود فایل اجرایت بذار.
موفق باشی.

Sajjad.Aghapour
دوشنبه 10 تیر 1387, 16:25 عصر
اقا مشکل دارم اساسی......
2 تا کد زیر رو ببینید.اینا مشکلشون چیه که عکس در بانک ذخیره نمیشه.
1.


MemoryStream ms = new MemoryStream();
pictureBox2.Image.Save(ms, pictureBox2.Image.RawFormat);
byte[] pic = ms.GetBuffer();
ms.Close();
cmd.CommandText = "insert into image (imagefile,pic) values (@imagefile,@pic)";
cmd.Connection = conn;
cmd.Parameters.Add("@imagefile", SqlDbType.NVarChar).Value = textBox1.Text;
cmd.Parameters.Add("@pic", SqlDbType.VarBinary).Value = pic;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

2.


cmd.CommandText = "insert into image" +
"(imagefile, pic)" +
"values (@imagefile,@pic)";
cmd.Connection = conn;
string imagefile = openFileDialog1.FileName;
byte[] pic = null;
FileStream fs = new FileStream(imagefile, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
pic = br.ReadBytes((int)fs.Length);
cmd.Parameters.Add("@imagefile", SqlDbType.NVarChar).Value = imagefile;
cmd.Parameters.Add("@pic", SqlDbType.VarBinary).Value = pic;

conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

در مورد Exception زیر لطفا یه توضیحی بدید...


String or binary data would be truncated.
The statement has been terminated.

top7news
دوشنبه 10 تیر 1387, 17:39 عصر
sajad جان یه نگاهی به کد های من میندازی ؟ کامل و درست کار میکنه و عکس به راحتی ذخیره میشه ها .

gdvenb عزیز حق با شماست
برای حالت کلی راه شما کاملا درست و منطقی .
البته من برنامه ام طوری که نهایتا 10 یا 12 نفر عکسشون توی بانک ذخیره میشه و حجم زیادی نمیگیره و چون حتما هر فرد باید یه عکس داشته باشه ، اگه خودش عکسی نیاره عکس پیش فرض ذخیره میشه ولی در حالت کلی راه شما درست تر ه ، ممنون.
راستی iranmsb عزیز مشکلت حل شد ؟ به دردت خورد برنامه ؟

Sajjad.Aghapour
دوشنبه 10 تیر 1387, 19:30 عصر
sajad جان یه نگاهی به کد های من میندازی ؟ کامل و درست کار میکنه و عکس به راحتی ذخیره میشه ها .


ممنون.کد های insert شما هم مثل کد اول منه.ولی روی سیستم من Exception زیر رو میده..


String or binary data would be truncated.
The statement has been terminated

raminsalemi
سه شنبه 18 تیر 1387, 12:15 عصر
دوست عزیز شما تنها عکسی رو میتونیددر بانک ذخیره کنین که فرمتش bmp باشه
این هم یک کد کامل:


if (textBox1.Text == "" || textBox2.Text == "")
{
MessageBox.Show("کاربر گرامی فرمان مورد نظر معتبر نیست لطفا ابتدا رمز عبور را وارد کنید", "سیستم هوشمند کنترل کابر", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
if (FullPath != null)
{



SqlConnection con = newSqlConnection("server=localhost;UID=sa;password=;DataBase=newspap er1");
con.Open();

SqlCommand cmd = newSqlCommand();
cmd.Connection = con;
cmd.CommandText = @"insert into Table6 values (@pusername,@ppassword,@pimage)";
cmd.Parameters.Add(@"pusername", SqlDbType.NVarChar, 50);
cmd.Parameters.Add(@"ppassword", SqlDbType.NVarChar, 50);
cmd.Parameters.Add(@"pimage", SqlDbType.Image, 1000000);
cmd.Prepare();
byte[] imageImageData = null;
byte[] imagebytes = null;
FileStream fs = newFileStream(FullPath, FileMode.Open, FileAccess.Read);
BinaryReader br = newBinaryReader(fs);
imagebytes = br.ReadBytes(Convert.ToInt32(fs.Length));
imageImageData = imagebytes;
cmd.Parameters[@"pusername"].Value = textBox1.Text;
cmd.Parameters[@"ppassword"].Value = textBox2.Text;
cmd.Parameters[@"pimage"].Value = imagebytes;
SqlDataAdapter dad = newSqlDataAdapter("select*from Table6 where ppassword='" + textBox2.Text + "'", con);
DataTable dt = newDataTable();
dad.Fill(dt);
DataView dv = newDataView(dt);
dv.Sort = "ppassword";
int intPosition;
intPosition = dv.Find(textBox2.Text);
if (intPosition == -1)
{
cmd.ExecuteNonQuery();
con.Close();
view1();
dataGridView2.Visible = true;
pictureBox1.Visible = true; ;
progressBar1.Visible = true;
timer1.Interval = 1;
timer1.Enabled = true;
MessageBox.Show(textBox1.Text + " عزیز شما اجازه دسترسی به این نرم افزار را دارید", "سیستم هوشمند کنترل کاربر");
textBox1.Text = "";
textBox2.Text = "";

}
else
{
MessageBox.Show(" کاربر گرامی ركورد مورد نظر موجود میباشدلطفا دقت کنید", "سیستم هوشمند بانک اطلاعاتی یدک طب", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
}
}
}

top7news
سه شنبه 18 تیر 1387, 17:30 عصر
کی میگه فقط عکس با فرمت bmp رو میشه تو بانک ذخیره کرد
اینهمه کد واسه چیه ؟؟ دوست عزیز اگه خودت نتونستی عکس با فرمت های دیگه رو ذخیره کنی دلیل بر نشدن اون کار نیست.
این کدها برای پبدا کردن عکس مورد نظر که توی یه دکمه باید بنویسیش ، البته یه picture box هم باید بذاری



try
{
OpenFileDialog dlgOpen = newOpenFileDialog();
dlgOpen.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF";
dlgOpen.Title = "انتخاب عکس";
if (dlgOpen.ShowDialog() == DialogResult.OK)
pictureBox1.Image = Image.FromFile(dlgOpen.FileName);
}
catch (SystemException ex)
{
msg.Show(ex.Message, " خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
}



اینم کد هایی که توی دکمه ثبت باید بنویسی :


MemoryStream ms = newMemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrPic = ms.GetBuffer();
ms.Close();
sqlConnection1.Open();
sqlDataAdapter2.InsertCommand.Parameters.Clear();
sqlDataAdapter2.InsertCommand.Parameters.AddWithVa lue("@num", textBox1.Text);
sqlDataAdapter2.InsertCommand.Parameters.AddWithVa lue("@pic", arrPic);
sqlDataAdapter2.InsertCommand.Parameters.AddWithVa lue("@name", textBox2.Text);
sqlDataAdapter2.InsertCommand.Parameters.AddWithVa lue("@fam", textBox3.Text);

sqlDataAdapter2.InsertCommand.CommandText = "insert into[اسم بانک] Values(@num,@pic,@name,@fam)";
sqlDataAdapter2.InsertCommand.ExecuteNonQuery();
msg.Show("متن پیغام خطا به کاربر"," خطا", MessageBoxButtons.OK, MessageBoxIcon.Information);
pictureBox1.Image.Dispose();
sqlConnection1.Close();


که البته اسم دیتا آداپتورها و بانک رو باید عوض کنی .

bermouda
جمعه 04 مرداد 1387, 01:35 صبح
با این کار واقعا حجم بانک خیلی میره بالا. نظر من اینه که یه تیبل بساز که نوعش nvarchar باشه و فایل رو آپلود کن و آدرس فایل آپلود شده رو بزار تو تیبل....

bermouda
جمعه 04 مرداد 1387, 01:40 صبح
sqlDataAdapter2.InsertCommand.CommandText = "insert into[اسم بانک] Values(@num,@pic,@name,@fam)";
.


این کار اصلا صحیح نیست چون توی تکست باکس میشه با یه فاصله و یا ویرگول و بعدش با یه تیکه کد و اسکریپت کل دیتا بیس رو ترکوند....
بهتریه که دستور رو تو Sql به صورت Sp بزنی و از تو سیشارپ پارامتر پاس بدی

top7news
جمعه 04 مرداد 1387, 09:35 صبح
البته مطمئن نیسم ولی فکر کنم ms رو زود close کردی .
fs هم نبستی .(stream.close)