PDA

View Full Version : سوال: مشکل در ذخیره و بازیابی تصویر در دیتابیس (به صورت باینری)



ezio potter
جمعه 15 خرداد 1394, 13:52 عصر
درود/
اول از همه عذرخواهی میکنم بابت این که یه تاپیک تکراری زدم.اما خوب هرچی گشتم هیچ کدوم از تاپیک های قبلی نتونست کار منو راه بندازه.
ممنون میشم اگه دوستان کمک کنند.
من یک بانک دارم بنام Automobile-Driver-Test که دارای سه جدولName و Question و Report هستش.
131959
الآن من میخوام که یک برنامه بنویسم که یک تصویر از ورودی بگیره و توی فیلد picture جدول Question قرار بده.
برنامه زیر رو آماده کردم که با کلیک روی دکمه browse یک تصویر از ورودی میگیره و در picturebox1 نمایش میده و بعد از این که کاربر از combobox موجود شماره سوال (که تصویر مربوط به اونه) انتخاب میکنه کلید save in DB فعال میشه.این کلید باید فرایند تبدیل تصویر به آرایه باینری و ذخیره در دیتا بیس رو انجام بده. اما وقتی این کلیدو میزنم با ارور object reference not set to an instance of an object روبرو میشم.

131961

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

private string strSQL;
private SqlConnection con;
private SqlDataAdapter da;
private SqlCommand com;
private DataSet ds;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
int[] list1 = new int[50];
for (int i = 0; i < 50; i++)
{
list1[i] = i + 1;
}

for (int n = 0; n < 50; n++)
{
comboBox1.Items.Add(list1[n]);
}

try
{
con = new SqlConnection("Data Source=localhost;Initial " + "Catalog=Automobile-Driver-Test;Integrated Security=True");
}

catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
}

private void button1_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog dlgOpen = new OpenFileDialog();
dlgOpen.Filter = "Image Files(*.BMP;*.JPG;*.GIF,*.png)|*.BMP;*.JPG;*.GIF;* .png" ;
dlgOpen.Title = "select pic";

if (dlgOpen.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(dlgOpen.FileName);
}

}

catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
}

private void button2_Click(object sender, EventArgs e)
{
try
{
strSQL = "INSERT INTO Question (picture) VALUES (@picture) where Question.q_code =";
strSQL += comboBox1.SelectedValue.ToString();
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrPic = ms.GetBuffer();
ms.Close();
con.Open();
com = new SqlCommand(strSQL, con);
com.Parameters.Add("@picture", SqlDbType.VarBinary).Value = arrPic;
com.ExecuteNonQuery();
con.Close();

}
catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
button2.Enabled = true;
}

}

am_al_59
جمعه 15 خرداد 1394, 17:21 عصر
این خطو

ms.GetBuffer();

تبدیل کن به


ms.ToArray();

davidrobert
جمعه 15 خرداد 1394, 20:51 عصر
نوع فیلد picture بزارید varbinary(MAX) برای ذخیره عکس و فراخونی تصویر از دیتابیس غیر از اینکه عکس رو ذخیره میکنه دیتابیس و نمایش میده حجم عکس رو هم خیلی کم میکنه مثلا اگه عکس 1 گیگ رو بدید بهش اون 1 مگابایت ذخیره میکنه نه 1 گیگ که دیتابیس بالا نیاد.

ebrahim.rayatparvar
شنبه 16 خرداد 1394, 10:08 صبح
سلام مهندس بزرگترین مشکلی من تو برنامه شما دیدم اینه که همونطوری که تو عکس اول از دیتابیس خودت نشون دادی میگی متغیر Picture داری از نوع Image ولی زمانی که میخوای ذخیره کنی به صورت باینری می فرستی که من این روش رو بهترین روش می دونم. پس راهی که داری میری درسته پس نوع متغیر Picture رو داخل دیتابیس خودت رو بگیر تغییر بده که هم نوع داده باینری که داری از طرف UI میفرستی به طرف دیتابیس.