PDA

View Full Version : مشکل در ثبت تصویر در دیتابیس



میلاد قاضی پور
سه شنبه 01 تیر 1389, 04:30 صبح
سلام . در این تاپیک (http://www.barnamenevis.org/forum/showthread.php?p=1019847) سوألی که مطرح کرده بودم در مورد مشکل استخراج عکس جوابی پیدا نکرد و بعد از تلاش و تحقیق بسیار در اینترنت متوجه شدم تا حالا راه حلی برای رفع ارور "parameter is not valid" پیدا نشده . خودم بسیار کدهام رو زیر و رو کردم و چند تا مقاله هم در مورد این ارور خوندم که متوجه شدم ثبت تصویر در آخرین لحظه با مشکل مواجه میشه . کد زیر رو ببینید . ابتدا تصویر در دیتا بیس ثبت میشه در جایی که با فلش نشون دادم طول اون آرایه 36111 هست . اما به دنبال همون کد وقتی بلا فاصله تصویر رو میخوام بازیابی کنم و فیلدها رو دونه دونه خواستم بررسی کنم متوجه شدم تصویر مورد نظر اصلا ثبت نشده و طول آرایه بایتم 13 هست .نمیدونم چرا این اتفاق میفته یک جایی خوندم در لحظه آخر mStream دیزپوز میشه چون منابع سیستم کم میشه و به اصطلاح پدیده قحطی پیش میاد . اما اگر قراره تصویر ثبت نشه چرا طول آرایه هنگام بازیابی 13 هست ؟من فکر میکردم 13 تعداد کاراکتر های System.Byte[] یا <binary data> هست . اما گویی مشکل خفن تر از این حرفاست .



http://sites.google.com/site/myuploadedimages/_/rsrc/1277165179655/home/barna-1/parameterisnotvalid/00.JPG


دوستان پروژه ای که در حال نوشتنش هستم اگر توانایی ذخیره تصویر نداشته باشه بوقم نیست . من باید حتما این مشکل رو حل کنم . اگر کمک کنید ممنون میشم .

Mahbadgroup
یک شنبه 06 تیر 1389, 09:31 صبح
با سلام من هم به اين مشكل برخوردم كه در نهايت متوجه شدم مشكل من در ذخيره Image در بانك مي باشد كه بايد به صورت پارامتري ذخيره شود.تا بتوانيم كد بايتهاي ذخيره شده را بخوانيم كد هاي زير را به كار ببريد


private void cmdSave_Click(object sender, EventArgs e)
{
try
{
//Read Image Bytes into a byte array
byte[] imageData = ReadFile(txtImagePath.Text);

//Initialize SQL Server Connection
SqlConnection CN = new SqlConnection(txtConnectionString.Text);

//Set insert query
string qry = "insert into ImagesStore (OriginalPath,ImageData) _
values(@OriginalPath, @ImageData)";

//Initialize SqlCommand object for insert.
SqlCommand SqlCom = new SqlCommand(qry, CN);

//We are passing Original Image Path and
//Image byte data as sql parameters.
SqlCom.Parameters.Add(new SqlParameter("@OriginalPath",
(object)txtImagePath.Text));

SqlCom.Parameters.Add(new SqlParameter("@ImageData",
(object)imageData));

//Open connection and execute insert query.
CN.Open();
SqlCom.ExecuteNonQuery();
CN.Close();

//Close form and return to list or images.
this.Close();
}


Following code explains how to read image file in to a byte array.

//Open file into a filestream and
//read data in a byte array.
byte[] ReadFile(string sPath)
{
//Initialize byte array with a null value initially.
byte[] data = null;

//Use FileInfo object to get file size.
FileInfo fInfo = new FileInfo(sPath);
long numBytes = fInfo.Length;

//Open FileStream to read file
FileStream fStream = new FileStream(sPath, FileMode.Open,
FileAccess.Read);

//Use BinaryReader to read file stream into byte array.
BinaryReader br = new BinaryReader(fStream);

//When you use BinaryReader, you need to

//supply number of bytes to read from file.
//In this case we want to read entire file.

//So supplying total number of bytes.
data = br.ReadBytes((int)numBytes);
return data;
}

میلاد قاضی پور
یک شنبه 06 تیر 1389, 10:04 صبح
امتحان کردم . متأسفانه باز هم همون خطا هنگام بازیابی اطلاعات داده میشه . مچکرم به خاطر زحمتی که کشیدید دوست عزیزم .

انیشتین
یک شنبه 06 تیر 1389, 10:33 صبح
سلام
برادر جان من اصلا با این داستانی که میگی کار نکردم و خیلی هم آشنا نیست، فقط یادمه سر کلاس یکی از بچه ها یه بحث هایی میکرد گفتم شاید به دردت بخوره.
من کد شما رو نخوندم و نمی دونم از کدوم روش استفاده کردی ولی به قول ایشون سه تا راه داریم:
1-استفاده از نوع داده image در دیتابیس که سرعت بیشتری برای بازیابی داره ولی جای بیشتری هم میگیره
2-استفاده از کدی که عکس رو باینری میکنه و بصورت دیتا در دیتا بیس ذخیره میکنه،بعد کد دیگه ای هست که اون رو بازیابی کرده و به حالت اول برمیگردونه
3-یه راه دیگه هم اینه که عکس رو در جایی روی هارد ذخیره کنی و آدرس عکس رو تو دیتا بیس ذخیره کنی،در حقیقت آدرس عکس رو از دیتا بیس میگیری که از دوتای دیگه جای بسیار کمتری اشغال میکنه و سرعت بازیابی خوبی هم داره

Mahbadgroup
یک شنبه 06 تیر 1389, 11:30 صبح
يك مثال برايتون فرستادم مشكل من رو كه حل كرد انشاا.. مشكل شما هم حل بشه.
ابتدا Table مورد نظر را ايجاد كنيد در فايل Text همراه پروژه موجود مي باشد

میلاد قاضی پور
سه شنبه 08 تیر 1389, 10:07 صبح
ممنون از همه . فکر کنم من متوجه شدم مشکل از چیه . اگر مشکل رو نتونیم حل کنیم ممکنه بعدا باز هم باهاش روبرو بشیم و باز باید بشینیم کدهای دیگران رو کپی پیست کنیم . و این راه درستی نیست .

به نظر میرسه اشتباه من اونجایی بوده که خواستم با اون دستور اس کیو ال (بدون استفاده از روش پارامترها) مقادیر رو وارد دیتابیس کنم . و چون در اون روش مجبوریم تمام مقادیر رو در بین کوتیشن قرار بدیم اگر به تصویر دقت کنید میبینید که در نهایت مقدار آرایه درون کوتیشن قرار میگیره و به صورت رشته در میاد مقدار درج شده در دیتابیس هم رشته ای میشه . من فهمیدم استفاده از این روش درج داده بیشتر برای زمانی مفید هست که تمام داده های مورد نظر ما رشته ای باشه . پس چاره کار در این هست که من از روش پارامتر ها ی اس کیو ال کامند استفاده کنم . اگر اون هم کارگر نیفتاد فکر کنم باید از فیلد ایمیج صرف نظر کنم چون شنیدم مایکروسافت دیگه در نگارشهای آتی اس کیو ال سرور فیلد ایمیج رو ارائه نکرده و نخواهد کرد و توصیه اش به کاربرا استفاده از فیلد varbinary(max) به جای ایمیج هست . به محض حل شدن کامل مشکل هم اینجا و هم جاهای دیگه که سوألم رو مطرح کردم توضیحات لازم رو میدم .

میلاد قاضی پور
سه شنبه 08 تیر 1389, 16:57 عصر
با لحن حیاتی خوانده شود:



بِسمِ اللهِ الرَحمنِ الرَحیم


۞انا فَتَحناکَ لَکَ فَتحاً مُبینا۞



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

الله اکبر ...الله اکبر ... الله اکبر....





string insertComm = "insert into users (name, lname , semat, username "+
",pass , image, sabtkonande) values(@name, @lname, @semat , @username , @pass , @image , @sabtkonande)";

rwd.command = new SqlCommand(insertComm, rwd.connection);
rwd.command.Parameters.Add("@name", SqlDbType.NVarChar);
rwd.command.Parameters.Add("@lname", SqlDbType.NVarChar);
rwd.command.Parameters.Add("@semat", SqlDbType.NVarChar);
rwd.command.Parameters.Add("@username", SqlDbType.NVarChar);
rwd.command.Parameters.Add("@pass", SqlDbType.NVarChar);
rwd.command.Parameters.Add("@image", SqlDbType.Image);
rwd.command.Parameters.Add("@sabtkonande", SqlDbType.NVarChar);
rwd.command.Parameters["@name"].Value = textBox1_name.Text;
rwd.command.Parameters["@lname"].Value = textBox2_lname.Text;
rwd.command.Parameters["@semat"].Value = textBox5_job.Text;
rwd.command.Parameters["@username"].Value = textBox3_uname.Text;
rwd.command.Parameters["@pass"].Value = textBox4_pass.Text;
rwd.command.Parameters["@image"].Value = pic;
rwd.command.Parameters["@sabtkonande"].Value = textBox6_sabtkonande.Text;
rwd.connection.Open();
rwd.command.ExecuteScalar();
rwd.connection.Close();
MessageBox.Show("کاربر مورد نظر با موفقیت ثبت شد.", "", MessageBoxButtons.OK, MessageBoxIcon.Information);


واقعا نماز شکر میخواد !

میلاد قاضی پور
سه شنبه 08 تیر 1389, 17:00 عصر
علتش همونی که گفتم بود. باید از روش پارامتر ها استفاده میشد .