PDA

View Full Version : سوال: آپدیت کردن عکس در دیتابیس



Ali0Boy
سه شنبه 15 دی 1388, 13:23 عصر
سلام دوستان من مشکلم در آپدیت کردن عکس در دیتابیس است لطفا کمکم کنید. از مدیران سایت هم درخواست دارم خواهشانه این تاپیک رو حذف نکنید من اول کلی گشتم ولی چیزی برای مشکلم پیدا نکردم. البته این کدی رو که میزارم از دوستان در برنامه نویس گرفتم ولی جواب نمیده نمی دونم چرا؟

کد:


System.IO.MemoryStream ms = new System.IO.MemoryStream();

picboxNew1.Image.Save(ms, picboxNew1.Image.RawFormat);
byte[] arrimages = ms.GetBuffer();
ms.Close();
strOle1 = "Update Name Table set [name]='" + ... + "', [تصوير شما]=@Pic where [ID]=" + newID;
op.Value = arrimages;
cmd.CommandText = strOle1;
cmd.Parameters.Add(op);
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
MessageBox.Show("Message","SAVE's Information's.");
ds1.Clear();
da1.Fill(ds1, "Name Table");
con.Close();



خطای برنام:
خط خطا:

cmd.ExecuteNonQuery();

در صورتی که شماره بندی فیلدهایم نیز مرتب و صحیح می باشد.
و پارامتر ها را نیز مقدار دهی کرده ام.


http://barnamenevis.org/forum/attachment.php?attachmentid=42064&stc=1&d=1262686657

M.YasPro
سه شنبه 15 دی 1388, 14:20 عصر
سلام
من از این استفاده می کنم :



public Bitmap ByteArrayToBitmap(byte[] bytes)
{
MemoryStream ms = new MemoryStream(bytes);
BinaryFormatter formatter = new BinaryFormatter();
Bitmap map = (Bitmap)formatter.Deserialize(ms);
ms.Close();
return map;
}

public byte[] BitmapToByteArray(Bitmap map)
{
byte[] bytes;
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, map);
bytes = ms.GetBuffer();
ms.Close();
return bytes;
}
private bool SaveImage2DBMS(Image img)
{
try
{
SqlConnection Connection;
SqlCommand Command;
SqlParameter parameter;
parameter = new SqlParameter();
Command = new SqlCommand();
byte[] bytes = BitmapToByteArray((Bitmap)img);
string Query = "update persons set face=@image where id=" + txtid1.Text;
parameter.ParameterName = "@image";
parameter.Size = bytes.Length;
parameter.DbType = DbType.Binary;
parameter.Value = bytes;
Connection = new SqlConnection("Data Source=.;Initial Catalog=persons;User ID=sa;Password=pwd");
Connection.Open();
Command.CommandType = CommandType.Text;
Command.CommandText = Query;
Command.Parameters.Clear();
Command.Parameters.Add(parameter);
Command.Connection = Connection;
int res = Command.ExecuteNonQuery();
Connection.Close();
if (res == 1)
return true;
else
return false;
}
catch
{
return false;
}
}

mir555
سه شنبه 15 دی 1388, 18:47 عصر
از دیتاست ها استفاده کن راحت می تونی binary خودتو تو دیتابیس ذخیره کنی

Ali0Boy
سه شنبه 15 دی 1388, 19:39 عصر
سلام
من از این استفاده می کنم :



public Bitmap ByteArrayToBitmap(byte[] bytes)
{
MemoryStream ms = new MemoryStream(bytes);
BinaryFormatter formatter = new BinaryFormatter();
Bitmap map = (Bitmap)formatter.Deserialize(ms);
ms.Close();
return map;
و ...


دوست عزیز ممنون. من از Access در این برنامه ام استفاده می کنم. در ضمن یادم رفته بود که بگم کدام قسمت از برنامه اون خطا رو میداد. الان درستش کردم بازم یه نگاه بیانداز اگه میشه همین جا درستش کرد که کدهام رو به هم نریزم. راستی من الان جایی نیستم که از اون قسمت کد اول که فرستادی رو امتحان کنم. ولی حتما که درسته. بازهم ممنون :چشمک:

Ali0Boy
سه شنبه 15 دی 1388, 19:46 عصر
از دیتاست ها استفاده کن راحت می تونی binary خودتو تو دیتابیس ذخیره کنی

دوست عزیز، من در کدهام از دیتاست نیز استفاده کرده ام. ولی اگه شما فکر میکنی که استفاده نکردم ممنون میشم با یک نمونه کد به من حالی کنی چون هرچی باشه با کد بهتر منظور هم رو می فهمیم نه :اشتباه:

slashslash2009
سه شنبه 15 دی 1388, 21:04 عصر
دوست من از این استفاده کن حتما نتیجه میگری کدش خیلی راحته :

strSQL = "update table1 SET pic=@pic where name=@nm";
MemoryStream ms = new MemoryStream();
pictureBox2.Image.Save(ms, pictureBox2.Image.RawFormat);
byte[] arrpic = ms.GetBuffer();
ms.Close();
con.Open();
com = new SqlCommand(strSQL, con);
com.Parameters.Add("@nm", SqlDbType.NChar).Value = textbox1.Text;
com.Parameters.Add("@pic", SqlDbType.VarBinary).Value = arrpic;
com.ExecuteNonQuery();
con.Close();محظ اطمینان :
در بالای فرم لود

private string strSQL;
private SqlConnection con;
private SqlCommand com;
در فرم لود :

con = new SqlConnection();

con.ConnectionString = (@"data source=.\sqlexpress;Initial catalog=databasename;Integrated Security=true");

M.YasPro
چهارشنبه 16 دی 1388, 07:09 صبح
دوست عزیز ممنون. من از Access در این برنامه ام استفاده می کنم.

فکر کنم برای استفاده از بانک اکسس فقط باید به جای sqlconnection و sqlcommand از oledbconnection , oledbcommand استفاده کنی

sajjadzare
چهارشنبه 16 دی 1388, 08:34 صبح
دوست من از این استفاده کن حتما نتیجه میگری کدش خیلی راحته :

strSQL = "update table1 SET pic=@pic where name=@nm";
MemoryStream ms = new MemoryStream();
pictureBox2.Image.Save(ms, pictureBox2.Image.RawFormat);
byte[] arrpic = ms.GetBuffer();
ms.Close();
con.Open();
com = new SqlCommand(strSQL, con);
com.Parameters.Add("@nm", SqlDbType.NChar).Value = textbox1.Text;
com.Parameters.Add("@pic", SqlDbType.VarBinary).Value = arrpic;
com.ExecuteNonQuery();
con.Close();محظ اطمینان :
در بالای فرم لود

private string strSQL;
private SqlConnection con;
private SqlCommand com;در فرم لود :

con = new SqlConnection();

con.ConnectionString = (@"data source=.\sqlexpress;Initial catalog=databasename;Integrated Security=true");


در اين حالت نميشه داده null به جاي عكس استفاده كرد بايد چه كرد ؟
(فرض كنيد pictureBox در برنامه است اگر كاربر دوست داشت عكس اضافه شده قبل رو ميتونه حذف كنه كه بايد به جاي آن داده null وارد كرد)

slashslash2009
چهارشنبه 16 دی 1388, 13:13 عصر
منظورتونو متوجه نشدم ولی اگر میخواید که اگر کاربر عکس جدیدی رو اضافه نکنه به طور یش فرض مثلا یه عکس سفیدو اضافه کنه

sajjadzare
چهارشنبه 16 دی 1388, 13:37 عصر
منظورتونو متوجه نشدم ولی اگر میخواید که اگر کاربر عکس جدیدی رو اضافه نکنه به طور یش فرض مثلا یه عکس سفیدو اضافه کنه

مثلا فرض كنيد يك دفتر تلفن باشه كه قابليت اضافه كردن عكس روداره كاربر عكسي رو اضافه ميكنه بعد ميفهمه كه عكس رو اشتباهي انتخاب كرده حالا ميخواد اون رو حذف كنه و عكسي براي آن شخص وارد نكنه كه در اين صورت بايد null وارد كنه كه نميشه
چكار كنيم كه بشه null وارد كرد
(خاصيت allowNull ستون رو درون sql تنظيم كرده ام)

slashslash2009
چهارشنبه 16 دی 1388, 14:25 عصر
منم این مشکلو داشتم ولی گفتم که همیشه در پیکچرباکسم یه عکسه سفید لود میشد که اگر کاربر هیچ عکسی رو وارد نکرد اون عکسه سفید وارد میشد میشه به جای null یک همیچین چیزی رو وارد کرد

Ali0Boy
چهارشنبه 16 دی 1388, 20:22 عصر
منم این مشکلو داشتم ولی گفتم که همیشه در پیکچرباکسم یه عکسه سفید لود میشد که اگر کاربر هیچ عکسی رو وارد نکرد اون عکسه سفید وارد میشد میشه به جای null یک همیچین چیزی رو وارد کرد

سلام دوست عزیز فکر نمی کنی برنامه بعد از یه مدت کوتاه حجم اون بره بالا و از حد استاندارد خارج شود. بهتر نیست قبل اون بسنجیم که اگر عکس بود با عکس ذخیره و اگر عکس نبود بدون عکس ذخیره کنه :متفکر: ؟! در ضمن برنامه ی "txtMusic" که تو وبلاگتون گذاشتید نیز خراب است لطفا بررسی کنید و مشکل اون رو حل کنید.
از تمامی دوستانی که در این تاپیک مارو همراهی کردند هم کمال تشکر را دارم. :قلب:

slashslash2009
چهارشنبه 16 دی 1388, 21:18 عصر
برنامه درسته احتمالا مشکل از کامپوننت DotNetBar هستش باید نصبش کنید
کلا بهتره تصویر در Sql server ذخیره نشه و در یک جای هارد دیسک عکسهارو ذخیره کرد و فقط ادرس عکسو در دیتابیس ذخیره کنیم

sajjadzare
چهارشنبه 16 دی 1388, 22:45 عصر
برنامه درسته احتمالا مشکل از کامپوننت DotNetBar هستش باید نصبش کنید
کلا بهتره تصویر در Sql server ذخیره نشه و در یک جای هارد دیسک عکسهارو ذخیره کرد و فقط ادرس عکسو در دیتابیس ذخیره کنیم

اينجوري وقتي برنامه رو به يه كامپيوتر ديگه ميبري بايد عكس ها هم كپي كني ببري كه اين خوب نيست

slashslash2009
چهارشنبه 16 دی 1388, 23:16 عصر
اينجوري وقتي برنامه رو به يه كامپيوتر ديگه ميبري بايد عكس ها هم كپي كني ببري كه اين خوب نيست
ما وقتی برنامه ای رو روی کامپیوتر دیگه میبریم یک برنامه داریم با یک دیتابیس خالی که باید در اون کامپیوتر داده های جدید ایجاد شوند

sky_in_iran
پنج شنبه 17 دی 1388, 07:59 صبح
سلام دوستان
با نظر استاد slashslash2009 (http://barnamenevis.org/forum/member.php?u=90145) من موافقم بهتر به جاي ذخيره عكس در بانك آدرس عكس و ذخيره كنيم و براي رفع مشكلي كه شما گفتي كه برنامه به يك كامپيوتر ديگه انتقال داده بشه يك فولدر در مسير جاري كه برنامه نصب ميشه يا قرار داره درست كن تصاويري كه كاربر انتخاب ميكنه رو كپي كن اونجا و از او مسير بخون اين روش بهتره چون ذخيره تصوير در بانك حجم زيادي ميگيره و بعد يه مدت شما فرض كن 1000 عكس بين 5 تا 15 مگابايتي ذخيره كردي اونوقت چي ميشه ؟

sajjadzare
پنج شنبه 17 دی 1388, 14:57 عصر
ما وقتی برنامه ای رو روی کامپیوتر دیگه میبریم یک برنامه داریم با یک دیتابیس خالی که باید در اون کامپیوتر داده های جدید ایجاد شوند


فرض كن شما يه برنامه ساختي كه اطلاعات مثلا يك هنرمند رو نشون ميده در اين شرايط شما ديتابيس خالي تحويل ميدي ؟!
و درباره نظر sky_in_iran (http://barnamenevis.org/forum/member.php?u=29534) : اگر درون مسير جاري هم عكس ها رو بريزيم كاربر ميره از همون جا عكس ها رو نگاه ميكنه ديگه نمياد داخل نرم افزار !

slashslash2009
پنج شنبه 17 دی 1388, 17:40 عصر
فرض كن شما يه برنامه ساختي كه اطلاعات مثلا يك هنرمند رو نشون ميده در اين شرايط شما ديتابيس خالي تحويل ميدي ؟!
و درباره نظر sky_in_iran (http://barnamenevis.org/forum/member.php?u=29534) : اگر درون مسير جاري هم عكس ها رو بريزيم كاربر ميره از همون جا عكس ها رو نگاه ميكنه ديگه نمياد داخل نرم افزار !
این چیزی که شما میگید رو نمیشه اسمشو یک نرم افزار گذاشت شبیه دایره المعارف است . ورودی بهش نمیدین که خروجی ازش بگیرید موفق باشید بیخیال