PDA

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



81579001
شنبه 30 آبان 1388, 00:59 صبح
سلام
یک برنامه ساده که اسم وعکس در دیتا بیس ذخیره کند را نوشتم(C#2008,SQL 2008)
اسم به تنهای ذخیره می شود ولی دستورات وارد کردن عکس را که می نویسم پیام خطا می دهد
پیام خطا بصورت عکس گذاشتم
متشکرم اگر راهنمای بفرمایید

saeeedft
شنبه 30 آبان 1388, 08:17 صبح
دوست عزیز شما در مقدار دهی پارامتر عکستون اشتباه کردید، به جای مقدار picturebox نام فایل مورد نظر رو بدید درست میشه

sky_in_iran
شنبه 30 آبان 1388, 09:20 صبح
سلام دوست عزيز
type فيلدت تو بانك چيه ؟ اگر متنيه (varchar,nvarchar) استاد عزيز در پست قبلي كامل درست گفته اما اگر byte يا image هست عملكردش فرق داره بايت اطلاعات تو به صورت آرايه اي از Byte تو بانك بريزي

AliRezaPro
شنبه 30 آبان 1388, 09:53 صبح
فیلدش رو ازنوع image بگیر و به این صورا پارامتر رو ارسال کن
comm.Parameters.Add(new SqlParameter("@Path", (object)tPath.Text));
comm.Parameters.Add(new SqlParameter("@Image", (object)image));

81579001
شنبه 30 آبان 1388, 09:58 صبح
سلام به اساتید گرامی
فیلد را Image گذاشتم
در مورد فرمایش شما

عملكردش فرق داره بايت اطلاعات تو به صورت آرايه اي از Byte تو بانك بريزي
متوجه منظور شما نشدم
متشکر م اگر راهنمای بفرمایید
باتشکر

81579001
شنبه 30 آبان 1388, 10:32 صبح
شرمنده
کد

cmd.Parameters.AddWithValue("@Asm", tbxAsm.Text);

cmd.Parameters.AddWithValue("@pic", pictureBox1);
کد های که وارد کردم
در قسمت Asm برای وارد کردن تکست باکس به تنهای جواب می دهد
ولی Pic پیام خطا در عکس بالا را می دهد

sky_in_iran
شنبه 30 آبان 1388, 10:52 صبح
دوست عزيز از كد زير استفاده كن :



byte[] imageData = ReadFile("آدرس تصوير");
public byte[] ReadFile(string sPath)
{
try
{
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;
}
catch { return null;}
}




بعد به جاي



cmd.Parameters.AddWithValue("@pic", pictureBox1);



pictureBox1 بنويس imageData

81579001
شنبه 30 آبان 1388, 11:20 صبح
اگر اجازه بدهید بنده یک بار کد را ارائه کنم
ودیگر عرض کنم می خواهم عکس با openFileDialog وارد شود
اما کد
این کدها را هر تکه از یک جای خورده نگیرید واگر اصلاح بفرماید متشکر میشوم
کدها برای کانکت شدن , openFileDialog ,Insert,... می باشد اگر جواب دهد مرتب خواهم کرد
باز هم تشکر


{

string pa = @"data source = (Local);Initial "+
"catalog=PicTest1;integrated security=true";
SqlConnection sc = new SqlConnection(pa);
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter();
DataView dv = new DataView();
CurrencyManager cm;
SqlCommand cmd = new SqlCommand("ProPicTest1",sc);
cmd.CommandType = CommandType.StoredProcedure;

MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrImage = ms.GetBuffer();
ms.Close();

cmd.Parameters.AddWithValue("@Asm",tbxAsm.Text);
cmd.Parameters.AddWithValue("@pic", pictureBox1);
sc.Open();
cmd.ExecuteNonQuery();
sc.Close();
}

81579001
شنبه 30 آبان 1388, 12:59 عصر
سلام
دوستان واساتید محترم اگر زحمتی نیست
بفرمایید اشکال کار بنده کجاست
پیشاپیش از راهنمای شما متشکرم

81579001
شنبه 30 آبان 1388, 23:01 عصر
عزیز

تاپیک حذف کردن
مشکل من حل نشد

saeeedft
شنبه 30 آبان 1388, 23:09 عصر
اقا نوع داده ای عکسو چی گرفتی؟

81579001
شنبه 30 آبان 1388, 23:18 عصر
ببخشید
image

81579001
شنبه 30 آبان 1388, 23:20 عصر
این کدها اشکالی دارند یا خیر

saeeedft
شنبه 30 آبان 1388, 23:20 عصر
varchar کنیدش، دیگه باید جواب بده

81579001
شنبه 30 آبان 1388, 23:29 عصر
در Build به این خط Error میده
در عکس زیر


cmd.Parameters.AddWithValue (openfiledialog1.filename());

saeeedft
شنبه 30 آبان 1388, 23:33 عصر
اقا علامت () رو از جلوی file name بردار

seven7777777
شنبه 30 آبان 1388, 23:35 عصر
سلام
ببخشید دوست عزیز
شما تکلیف رو روشن کن بعد دنبال جواب بگرد :
1. نوع داده ای رو چی گرفتی ؟
2. می خوای چی ذخیره کنی ؟ یه جا PictureBox پاس میدی ، یه جا اسم فایلو ...


MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrImage = ms.GetBuffer();
ms.Close();

cmd.Parameters.AddWithValue("@Asm",tbxAsm.Text);
cmd.Parameters.AddWithValue("@pic", pictureBox1);
در همین کد بالا فقط به جای picturebox1 در خط آخر همون arrimage رو پاس بده .
{ البته اگه یادم مونده باشه اینجوری بود }

81579001
شنبه 30 آبان 1388, 23:35 عصر
فرقی نکرد همان خطا

saeeedft
شنبه 30 آبان 1388, 23:40 عصر
اقا طبق این کد عمل کن، دوستمون راست میگه، شما اینطور عمل کن

SqlConnection con = new SqlConnection();
con.ConnectionString = "data source=(local); initial catalog=m;integrated security=true";
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrpic = ms.GetBuffer();

ms.Close();
string s="insert into person values(@id,@arrpic)";
SqlCommand cmd=new SqlCommand(s,con);
cmd.Parameters.AddWithValue("@arrpic", arrpic);
cmd.Parameters.AddWithValue("@id", textBox2.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();

81579001
شنبه 30 آبان 1388, 23:43 عصر
سلام
دوست عزیز
نوع داده را اول Image گذاشتم که فرمودند به varchar تغییر دادم
می خواهم یک عکس همراه اسم در دیتابیس ذخیره شود
اسم از تکست باکس و عکس از PictureBox دریافت می شود

81579001
شنبه 30 آبان 1388, 23:50 عصر
به این خط Error میدهد



cmd.Parameters.AddWithValue("@pic",arrpic);

seven7777777
شنبه 30 آبان 1388, 23:51 عصر
شما نوع دیتابیس رو Varbinary بگذار و همین روش رو انجام بده . البته الان یادم نیست ولی فکر کنم همین طوری بود .
انشاالله که حل میشه .

81579001
شنبه 30 آبان 1388, 23:53 عصر
باکمال تاسف نشد

این کد را نمی شناسد


arrpic

saeeedft
شنبه 30 آبان 1388, 23:57 عصر
اقا این کدی که من گذشتم رو عین این کد رو نذار،اسم فیلد های خودت رو روش بذار، این کد هیچ اشکالی نداره
دقت کنی تو کدات جواب میگیری، موفق باشی

seven7777777
شنبه 30 آبان 1388, 23:59 عصر
regCom.CommandText = "INSERT INTO MembersPic (rescode,pic) VALUES (@rescode,@pic)";
regCom.Parameters.Add("@rescode", SqlDbType.NChar).Value = newMember.code;
regCom.Parameters.Add("@pic", SqlDbType.VarBinary).Value = (object)newMember.pic;
regCom.ExecuteNonQuery();
من از این کد برای ثبت تصویر تو دیتابیس استفاده می کنم و از کد زیر برای تبدیل یک تصویر به Byteها .

public static byte[] ReadPicByte(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;
}
مشکلی هم نداره . ورودی این تابع همون آدرس عکس که از OpenFileDialog گرفتی . data برگشتی از این تابع در newMember.pic قرار داره که تو ثبت استفاده شده .

81579001
یک شنبه 01 آذر 1388, 00:06 صبح
تمام کدهای که من دارم در همین چند خط می باشد وهر تکه از آنرا از جای گرفتم
خواهش می کنم بیشتر راهنملی بفرمایید تا بدانم چکاری باید انجام برم قسمت دوم کدها را هرکجا میگذارم قبول نمی کند

seven7777777
یک شنبه 01 آذر 1388, 00:13 صبح
متاسفانه شما مشکل رو دقیق باز نمی کنی . اینجوری توقع گرفتن جواب درست و به موقع نداشته باش .

1. ببین اول شما باید فیلد دیتابیست از نوع VarBinary باشه .
2. باید با یه سری دستور از آدرس عکسی که داری Byteهای اونو دربیاری و تو یه متغیر از نوع byte[] ذخیره کنی .
3. باید به شکلی که در بالا گفتم اونها رو پاس بدی به دستور Insert .

راستی دیدم که با StoredProcedure کار کردی ، شاید هم اشکال از اون باشه . اینبار Query روداخل خود C# و در یک Command بنویس ، ببین چی میشه !!!

saeeedft
یک شنبه 01 آذر 1388, 00:16 صبح
اقا به باور کن اون کدی که من گذاشتم رو با دادهای خودت تطبیق بدی حله:متعجب:

81579001
یک شنبه 01 آذر 1388, 00:27 صبح
شرمند که اذیت شدید
من هم شروع میکنم به روی آن بیشتر کار کردن انشالله که درست بشود
درمورد دیتا بیس هم تغییر دادم اما نشد
نمیدانم چطور می شود عکس را در دیتابیس ذخیره کرد البته یک برنامه در همین سایت بود که این
کار را می کرد ولی کدهای زیادی داشت وپیچیده بود کار هم داد
نتوانستم آن را در برنامه های خودم بکار بگیرم
از نوع ویزار نمی خواهم استفاده کنم
و مایلم با sql کار کنم در برنامه مطرح شده هم همینطور بود فقط مشکل پیچیدگی کدها بود
از کتاب هم استفاده کردم عین کدهارا وارد کردم نشد
با تشکر فراوان

saeeedft
یک شنبه 01 آذر 1388, 00:31 صبح
اقا شما کد منو با نوع varchar ذخیره کن متمئن باش میشه، شما 2 تا فیلد تو کد های من بیشتر نمیبینی که، اونا رو جایگذاری کن حله، سوالی بود و اگه تونستم کمک کنم در خدمتم

81579001
یک شنبه 01 آذر 1388, 00:33 صبح
عزیزم با خطای آن چکار کنم

saeeedft
یک شنبه 01 آذر 1388, 00:41 صبح
اقا شما تازه سی شارپ رو شروع کردی؟ چون کد های من پیچیده نبود، اگه تازه شروع کردی، به نظر من اگه اول کمی مطالعه کنی بهتر جواب میگیری، چون اینطور عملا فقط داری کدها رو کپی میکنی و اگه درست هم کار کنه از منطق اون سر در نمیاری و اگه اینطور بشه نمیتونی علت error های برنامتون رو بفهمید

81579001
یک شنبه 01 آذر 1388, 00:47 صبح
بله تازه کار هستم اما در مورد خطا این کد را نمی شناسد

saeeedft
یک شنبه 01 آذر 1388, 09:13 صبح
شما یه لطفی کن، تصویر کل کدی که توی فرمت نوشتی رو بذار اینجا

81579001
یک شنبه 01 آذر 1388, 12:14 عصر
سلام
مشکل حل شد
با همان image
حالا دارم روی نمایش آن از روی دیتابیس کار می کنم
فعلاً موقع نمایش در دیتاگرید ویو فقط قسمت کوچکی از عکس را نشان می دهد ودر pictureBox را هنوز نتوانستم ولی در تلاش هستم
باتشکر از شما ودیگر استاد عزیز که حوصله کردید