احمد سامعی
جمعه 18 اردیبهشت 1388, 05:14 صبح
سلام
من يك نمونه برنامه نوشتم كه تقريباً هر كاري كه لازم در ارتباط با عكس و پايگاه داده صورت بگيره توش هست و بعضي جاها تو كد به فارسي توضيح دادم
برنامه با VS 2008 هست
اما از فريم فرك دو استفاده كردم تا بقيه هم بتونند نحوه كار ببينند
پايگاه داده اكسس 2003
كارايي برنامه
1. باز كردن عكس دلخواه
2. تغيير سايز عكس
3. ذخيره در بانك
4. بازيابي و نمايش
5. به روز رساني عكسهاي ذخيره شده با سايز جديد
6. قابليت حذف
http://barnamenevis.org/forum/attachment.php?attachmentid=30623&stc=1&d=1241766966
اميدوارم اين كمكي باشه بر سوالات دوستان در اين مورد
اما چند مورد:
در اين مثال بانك Access هست و فرمت فيلد عكس داخل بانك هم از نوع OLE Object هست. براي SQL Server هم از نوع( VARBINERY(MAX مي شه استفاده كرد.
مايکروسافت قويا هشدار داده است که ديگر از نوع داده IMAGE استفاده نکنيد و به جاي آن از نوع دادة (VARBINERY(MAX استفاده کنيد؛ بايد بدانيد که نوع دادة IMAGE فقط براي سازگاري با SQL Server 2000 هنوز در SQL Server 2005 وجود دارد و در نگارش بعدي SQL Server ، ديگر اين نوع داده پشتيباني نخواهد شد.
كدهاي ذخيره سازي:
private void btSave_Click(object sender, EventArgs e)
{
try
{
MemoryStream ms = new MemoryStream();
imageBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
oleDbCommand1.Parameters.Clear();
oleDbCommand1.Parameters.Add("@Id", OleDbType.BSTR).Value = ++count;
oleDbCommand1.Parameters.Add("@Pic", OleDbType.Binary).Value = bytes;
oleDbCommand1.CommandText = "insert into Pic (id, pic) values(@Id, @pic)";
oleDbCommand1.ExecuteNonQuery();
tbTotal.Text = count.ToString();
index = count;
flag = true;
MessageBox.Show("Saved successful");
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
كدهاي بازيابي و نمايش:
private void btShow_Click(object sender, EventArgs e)
{
if (tbNumber.Text != string.Empty)
{
if (count >= Int32.Parse(tbNumber.Text))
{
Show(Int32.Parse(tbNumber.Text));
}
else MessageBox.Show("شماره عكس مورد نظر بيشتر از تعداد عكس موجود در فايل اطلاعاتي است، امكان نمايش نيست");
} else MessageBox.Show("شماره عكس مورد نظر براي نمايش را انتخاب كنيد");
}
private void Show(int indexID)
{
try
{
GC.Collect();//اين متد براي تخليه منابع سيستم فراخواني مي شود
oleDbCommand1.CommandText = "SELECT pic FROM Pic WHERE id=" + indexID + "";
OleDbDataReader myReader = oleDbCommand1.ExecuteReader();
if (myReader.Read())
{
MemoryStream ms = new MemoryStream((byte[])(myReader.GetValue(0)));
imageBox1.Image = Image.FromStream(ms);
}
myReader.Close(); index = indexID;
flag = true; lbInfo.Text = "Original Size: " + imageBox1.Image.Size;
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
همونطور كه مي بينيد از MemoryStream براي اين كار استفاده شده
در ضمن به عمد از ImageBox خود دات نت استفاده نكردم و يك ImageBox سفارشي استفاده كردم كه قابليت هاي خوبي براي كار با عكس داره كه دوستان مي تونند سورس و توضيحات لازم اين كنترل از اين لينك (http://www.barnamenevis.org/forum/showthread.php?t=150056)دريافت كنند.
(به دليل محدوديت در حجم فايل هاي پيوستي من سه قسمت گذاشتم براي اجراي برنامه بعد از دانلود هر سه فايل بايد براي فقط اجراي نسخه اجرايي پوشه DataBase در مسير برناه قرار بديد و براي استفاده از سورس لازم Dll هاي داخل فايل Demo به پوشه Debug اضافه كنيد همچنين به ToolBox ويژوال استديدو خودتون)
سوالي اگر بود در خدمتم
من يك نمونه برنامه نوشتم كه تقريباً هر كاري كه لازم در ارتباط با عكس و پايگاه داده صورت بگيره توش هست و بعضي جاها تو كد به فارسي توضيح دادم
برنامه با VS 2008 هست
اما از فريم فرك دو استفاده كردم تا بقيه هم بتونند نحوه كار ببينند
پايگاه داده اكسس 2003
كارايي برنامه
1. باز كردن عكس دلخواه
2. تغيير سايز عكس
3. ذخيره در بانك
4. بازيابي و نمايش
5. به روز رساني عكسهاي ذخيره شده با سايز جديد
6. قابليت حذف
http://barnamenevis.org/forum/attachment.php?attachmentid=30623&stc=1&d=1241766966
اميدوارم اين كمكي باشه بر سوالات دوستان در اين مورد
اما چند مورد:
در اين مثال بانك Access هست و فرمت فيلد عكس داخل بانك هم از نوع OLE Object هست. براي SQL Server هم از نوع( VARBINERY(MAX مي شه استفاده كرد.
مايکروسافت قويا هشدار داده است که ديگر از نوع داده IMAGE استفاده نکنيد و به جاي آن از نوع دادة (VARBINERY(MAX استفاده کنيد؛ بايد بدانيد که نوع دادة IMAGE فقط براي سازگاري با SQL Server 2000 هنوز در SQL Server 2005 وجود دارد و در نگارش بعدي SQL Server ، ديگر اين نوع داده پشتيباني نخواهد شد.
كدهاي ذخيره سازي:
private void btSave_Click(object sender, EventArgs e)
{
try
{
MemoryStream ms = new MemoryStream();
imageBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
oleDbCommand1.Parameters.Clear();
oleDbCommand1.Parameters.Add("@Id", OleDbType.BSTR).Value = ++count;
oleDbCommand1.Parameters.Add("@Pic", OleDbType.Binary).Value = bytes;
oleDbCommand1.CommandText = "insert into Pic (id, pic) values(@Id, @pic)";
oleDbCommand1.ExecuteNonQuery();
tbTotal.Text = count.ToString();
index = count;
flag = true;
MessageBox.Show("Saved successful");
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
كدهاي بازيابي و نمايش:
private void btShow_Click(object sender, EventArgs e)
{
if (tbNumber.Text != string.Empty)
{
if (count >= Int32.Parse(tbNumber.Text))
{
Show(Int32.Parse(tbNumber.Text));
}
else MessageBox.Show("شماره عكس مورد نظر بيشتر از تعداد عكس موجود در فايل اطلاعاتي است، امكان نمايش نيست");
} else MessageBox.Show("شماره عكس مورد نظر براي نمايش را انتخاب كنيد");
}
private void Show(int indexID)
{
try
{
GC.Collect();//اين متد براي تخليه منابع سيستم فراخواني مي شود
oleDbCommand1.CommandText = "SELECT pic FROM Pic WHERE id=" + indexID + "";
OleDbDataReader myReader = oleDbCommand1.ExecuteReader();
if (myReader.Read())
{
MemoryStream ms = new MemoryStream((byte[])(myReader.GetValue(0)));
imageBox1.Image = Image.FromStream(ms);
}
myReader.Close(); index = indexID;
flag = true; lbInfo.Text = "Original Size: " + imageBox1.Image.Size;
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
همونطور كه مي بينيد از MemoryStream براي اين كار استفاده شده
در ضمن به عمد از ImageBox خود دات نت استفاده نكردم و يك ImageBox سفارشي استفاده كردم كه قابليت هاي خوبي براي كار با عكس داره كه دوستان مي تونند سورس و توضيحات لازم اين كنترل از اين لينك (http://www.barnamenevis.org/forum/showthread.php?t=150056)دريافت كنند.
(به دليل محدوديت در حجم فايل هاي پيوستي من سه قسمت گذاشتم براي اجراي برنامه بعد از دانلود هر سه فايل بايد براي فقط اجراي نسخه اجرايي پوشه DataBase در مسير برناه قرار بديد و براي استفاده از سورس لازم Dll هاي داخل فايل Demo به پوشه Debug اضافه كنيد همچنين به ToolBox ويژوال استديدو خودتون)
سوالي اگر بود در خدمتم