PDA

View Full Version : سوال: ذخیره مدارک دریافتی از داوطلب، در دیتابیس



cse.Abdali
سه شنبه 28 خرداد 1392, 09:50 صبح
سلام
من در پروژه مدیریت آموزشگاه، برای موجودیت Student ، هنگام ثبت نام مدارکی از قبیل عکس، تصویر کارت ملی و... را میخوام اسکن و ذخیره کنم.
سوال اولم اینه که:
بهتره تصویر مدارک نگهداری بشن یا آدرسشون؟
سپاس

fakhravari
سه شنبه 28 خرداد 1392, 12:51 عصر
دست شماست.
فکر نکنم ذخیره اینها در دیتابیس باعث بالا رفتم حجمشون بشه.
اینهایی که گفتید باید اسکن شود و در قالب یه فایل باینری ذخیره کنید یعنی فیلد شما باینری مکس باید باشه.
در قالب یه اپلود میتونید read byte کنید.

alexmcse
سه شنبه 28 خرداد 1392, 17:29 عصر
سلام
من در پروژه مدیریت آموزشگاه، برای موجودیت Student ، هنگام ثبت نام مدارکی از قبیل عکس، تصویر کارت ملی و... را میخوام اسکن و ذخیره کنم.
سوال اولم اینه که:
بهتره تصویر مدارک نگهداری بشن یا آدرسشون؟
سپاس

آدرسشون ذخیره کنی بهتره است
در کنار پروژه یک فولدر میسازی وتمام کارت ملیها را درون آن قرار میدهی و آدرسشونو در دیتابیس ذخیره میکنی

davidrobert
سه شنبه 28 خرداد 1392, 18:46 عصر
اگه نظر من رو میخواهید عکس رو در داخل دیتابیس ذخیره کنید و باقی اطلاعات رو وارد کنید.داخل دیتابیس یه فیلد تعریف کنید برای عکس نوش رو بزارید varbinary(MAX) و با این دستور اول عکس رو کوچیک کنید که حجم عکس زیاد نباشه.و عکس رو ذخیره کنید بهتر هستش چون ممکنه عکس جابه جا بیش و دیگه برای مشاهده وجود نداشته باشه.این کد برای تغییر اندازه کردن عکس . // کاراهای مخصوص تغییر اندازه عکس
#region Private Members
private Image picimage= Properties.Resources.EmployeesNoPic;
#endregion

#region Propersties
private int _imgwidth
{
get
{
return 120;
}
}

private int _imgHieght
{
get
{
return 140;
}
}
#endregion

#region Public Function
public Bitmap ResizeBitMap(Bitmap b, int nWidth, int nHeight)
{
Bitmap result = new Bitmap(nWidth, nHeight);
using (Graphics g = Graphics.FromImage((Image)result))
g.DrawImage(b, 0, 0, nWidth, nHeight);
return result;
}
#endregion این کد برای باز کردن عکس
private void btnPic_Click(object sender, EventArgs e)
{
try
{

OpenFileDialog fd = new OpenFileDialog();
fd.Filter = "(*.JPG) تصاویر|*.jpg|" +
"(*.GIF) تصاویر|*.Gif" +
"(*.PNG) تصاویر|*.PNG" +
"" +"(*.*) تمام تصاویر|*.*";
fd.Title = "انتخاب تصویر";
fd.ShowDialog();
float imgWidth = System.Drawing.Image.FromFile(fd.FileName).Physica lDimension.Width;
float imgHeight = System.Drawing.Image.FromFile(fd.FileName).Physica lDimension.Height;
picimage = System.Drawing.Image.FromFile(fd.FileName);
if (imgWidth > _imgwidth || imgHeight > _imgwidth)
{
string strMessage = "تصویر انتخابی شما نباید بزرگتر از {1}*{0} پیکسل باشد" + "\n" +
"آیا تمایل به تغییر اندازه عکس دارید ؟";
if (PersianMessageBox.Show(string.Format(strMessage, _imgwidth, _imgHieght), "پیام سیستم", PersianMessageBox.Buttons.YesNo, PersianMessageBox.Icon.Warning) == DialogResult.Yes)
{
picimage = ResizeBitMap((Bitmap)picimage, _imgwidth, _imgHieght);
Pictcurebox1.Image = picimage;
}
else
{
picimage = Properties.Resources.EmployeesNoPic;
Pictcurebox1.Image = picimage;
}
}
else
{
Pictcurebox1.Image = picimage;
}
}
catch { }
} این کد هم برای ذخیره اطلاعات
private void BtnAdd_Click(object sender, EventArgs e)
{
if (TxtAddNumber.Text.Trim() == "")
{
errorProvider1.SetError(TxtAddNumber, "لطفاً شماره ثبت شرکت را وارد فرمائید");
TxtAddNumber.Focus();
return;
}
if (cmbNoyeMosse.Text.Trim() == "")
{
errorProvider1.SetError(cmbNoyeMosse, "لطفاَ نوع موسسه را وارد فرمایید");
cmbNoyeMosse.Focus();
return;
}
if (TxtNameCompaney.Text.Trim() == "")
{
errorProvider1.SetError(TxtNameCompaney, "لطفاً نام شرکت را وارد فرمائید");
TxtNameCompaney.Focus();
return;
}
if (TxtNameDefter.Text.Trim() == "")
{
errorProvider1.SetError(TxtNameDefter, "لطفاً نام دفتر را وارد فرمائید");
TxtNameDefter.Focus();
return;
}
if(CmbSex.Text.Trim()=="")
{
errorProvider1.SetError(CmbSex, "لطفاً جنسیت را تعریف فرمائید");
CmbSex.Focus();
return;
}
if (TxtNameAdmin.Text.Trim() == "")
{
errorProvider1.SetError(TxtNameAdmin, "لطفاً نام مدیر را وارد فرمائید");
TxtNameAdmin.Focus();
return;
}
if (TxtTel.Text.Trim() == "")
{
errorProvider1.SetError(TxtTel, "لطفاً شماره تماس را وارد فرمائید");
TxtTel.Focus();
return;
}
if (TxtCreateDate.Text.Trim() == "")
{
errorProvider1.SetError(TxtCreateDate, "لطفاً تاریخ احداث ایجاد شرکت را وارد فرمائید");
TxtCreateDate.Focus();
return;
}
if (TxtAddress.Text.Trim() == "")
{
errorProvider1.SetError(TxtAddress, "لطفاً آدرس شرکت را وارد فرمائید");
TxtAddress.Focus();
return;
}
if (TxtDistrbuite.Text.Trim() == "")
{
errorProvider1.SetError(TxtDistrbuite, "لطفاً شرح و وظایف شرکت را وارد فرمائید");
TxtDistrbuite.Focus();
return;
}
//if (Pictcurebox1.Image == null)
//{
// PersianMessageBox.Show("شما هیچ تصویری را برای این گذاینه انتخاب نکردید", "خطا در یافت تصویر", PersianMessageBox.Buttons.OK, PersianMessageBox.Icon.Error);
//}
else
{
try
{
MemoryStream ms = new MemoryStream();
try
{
Pictcurebox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
}
catch { }
byte[] arrPic = ms.GetBuffer();
ms.Close();
//SqlConnection con = new SqlConnection();
//con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DbPoshakSayeBan.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
db.Connect();
db.cmd = new SqlCommand();
db.cmd.Connection = db.con;
db.cmd.CommandText = "insert into TBL_Compane (C_AddNumber,C_NameDefterMaly,C_NoyeMosse,C_NameMo sse,C_Sex,C_Admin,C_Distrbuite,C_Tel,C_Fax,C_DateC reate,C_Addreass,C_Logo) Values " +
"(@C_AddNumber,@C_NameDefterMaly,@C_NoyeMosse,@C_Na meMosse,@C_Sex,@C_Admin,@C_Distrbuite,@C_Tel,@C_Fa x,@C_DateCreate,@C_Addreass,@C_Logo)";
//cmd.Parameters.AddWithValue("@C_ID", Int32.Parse(txtid.Text));
db.cmd.Parameters.AddWithValue("@C_AddNumber",TxtAddNumber.Text);
db.cmd.Parameters.AddWithValue("@C_NameDefterMaly", TxtNameDefter.Text);
db.cmd.Parameters.AddWithValue("@C_NoyeMosse", cmbNoyeMosse.SelectedItem.ToString());
db.cmd.Parameters.AddWithValue("@C_NameMosse", TxtNameCompaney.Text);
db.cmd.Parameters.AddWithValue("@C_Sex", CmbSex.SelectedItem.ToString());
db.cmd.Parameters.AddWithValue("@C_Admin", TxtNameAdmin.Text);
db.cmd.Parameters.AddWithValue("@C_Distrbuite", TxtDistrbuite.Text);
db.cmd.Parameters.AddWithValue("@C_Tel", TxtTel.Text);
db.cmd.Parameters.AddWithValue("@C_Fax", TxtFax.Text);
db.cmd.Parameters.AddWithValue("@C_DateCreate", TxtCreateDate.Text);
db.cmd.Parameters.AddWithValue("@C_Addreass", TxtAddress.Text);
db.cmd.Parameters.AddWithValue("@C_Logo", SqlDbType.Image).Value = arrPic;
db.cmd.ExecuteNonQuery();
db.Disconnect();
FrmCompane_Load(null, null);
}
catch(Exception ex)
{
if (!ShowFrienMessge)
PersianMessageBox.Show(ex.Message);
else
PersianMessageBox.Show("اشکال در ذخیره اطلاعات / خطا 103", "خطا", PersianMessageBox.Buttons.OK, PersianMessageBox.Icon.Error);
//if (db.LastError != "")
// PersianMessageBox.Show("خطا 103" + db.LastError);
}
}
به وسیله این می ونید اطلاعات خود را ذخیره کنید و تصویر هم با حجم کم ذخیره مکنید که سیستم سنگین نشه اگگه حجک عکس بیشتر بود کم میشه. و به صورت باینری ذخیره میشه.

fakhravari
سه شنبه 28 خرداد 1392, 20:39 عصر
دقت داشته باشین که حجم دیتابیس تا گیگ ها قابل افزایش پس نگرانی نیست.

davidrobert
سه شنبه 28 خرداد 1392, 20:50 عصر
دقت داشته باشین که حجم دیتابیس تا گیگ ها قابل افزایش پس نگرانی نیست.
بله دیتابیس میتونه اطلاعات رو حجم بسیاز یاد در خود ذخیره کنه ولی وقتی حجم دادها زاد شود اون موقع در بالا امد سیستم ، سیستم سنگین میشود و دیر بالا میاد مثل این میمونه وقتی 70000 رکود داریم و میخوایم فراخوانی کنیم نزدیک 1 یا 2 دقیقه میکشه حالا به این توجه داشته باشیم عکس رو حجم زیاد ذخیره کنیم و میخواد بالا بیاد 70000 تا رکورد به جای 1 یا 2 دقیقه 20 یا 30 دقیقه بکشه این هم هستش.برادر

mousa1992
سه شنبه 28 خرداد 1392, 21:29 عصر
نه ادرسو ذخیره کن و نه خود عکسو
با ی الگوریتم خاصی تصاویر رو تغییر نام بده و تو پوشه مورد نظرت ذخیره کن
مثلا student با id = 10 تصاویری داره با نام هایی که با 10 آغاز میشه و بقیشو دیگه مهم نیس که چی میذاری
و موقعی که میخوای بازیابی کنی تصاویرو از همین الگوریتم استفاده میکنی و تصاویر مربوط به این دانش آموز رو برمیگردونی

موفق

alexmcse
سه شنبه 28 خرداد 1392, 21:38 عصر
منم منظورم همین بود عکس رادر پوشه قرار بده و شناسه برای عکس در نظر بگیرد
(که میتون آدی باشه یا آدرس و یاو.....)

tooraj_azizi_1035
سه شنبه 28 خرداد 1392, 21:46 عصر
در نسخه 2012 قابلیت File Table به SQL Server اضافه شده که به همین منظور (ذخیره داده ها حجیم) جهت جدا کردن اون از داده های کم حجم تر استفاده میشه.
قبل از اینکه بتونید استفاده کنید باید قابلیت FILESTREAM رو فعال کنید:http://msdn.microsoft.com/en-us/library/cc645923.aspx
و بعد یکی از روی لینک قدم به قدم بسازید:http://msdn.microsoft.com/en-us/library/gg509088.aspx
و بعد تصاویرتون رو لود کنید: http://msdn.microsoft.com/en-us/library/gg492083.aspx

-- Add a path locator column to the PhotoMetadata table.
ALTER TABLE PhotoMetadata ADD pathlocator hierarchyid;

-- Get the root path of the Photo directory on the File Server.
DECLARE @UNCPathRoot varchar(100) = '\\RemoteShare\Photographs';

-- Get the root path of the FileTable.
DECLARE @FileTableRoot varchar(1000);
SELECT @FileTableRoot = FileTableRootPath('dbo.PhotoTable');

-- Update the PhotoMetadata table.

-- Replace the File Server UNC path with the FileTable path.
UPDATE PhotoMetadata
SET UNCPath = REPLACE(UNCPath, @UNCPathRoot, @FileTableRoot);

-- Update the pathlocator column to contain the pathlocator IDs from the FileTable.
UPDATE PhotoMetadata
SET pathlocator = GetPathLocator(UNCPath);

salehsam
چهارشنبه 29 خرداد 1392, 08:50 صبح
اگه میشه در مورد ذخیره عکس در فایل و ذخیره آدرس عکس تو دیتابیس اطلاعاتی بدین

cse.Abdali
چهارشنبه 29 خرداد 1392, 08:50 صبح
با تشکر از راهنمایی همه دوستان
آقای fakhravari، منم با نظر davidrobert موافقم. احساس می کنم ذخیره عکس ها در دیتابیس، هر چند حجم عکس ها را پایین بیاریم ممکنه باعث کند شدن سیستم بشه
ولی از طرفی هم نگران امنیت داده هام هستم و اینکه هرکسی که وارد سیستم بشه می تونه به عکس ها و سایر مدارک داوطلبا دسترسی داشته باشه. (البته نمی دونم این کار مشکلات احتمالی دیگه ای هم داره یا نه)

cse.Abdali
چهارشنبه 29 خرداد 1392, 08:55 صبح
آقای tooraj_azizi_1035
بنده با نسخه 2008R2 دیتابیسم را ایجاد کردم
انشاءالله بعد از تغییر ورژن حتما در پروژه هام از این قابلیتی که فرمودید استفاده می کنم

diamond-program
چهارشنبه 29 خرداد 1392, 09:05 صبح
ما که کسی نیستیم بین این اساتید که نقل قول کردن ولی به نظر من اگه عکس را ذخیره کنی بهتر باشه

davidrobert
چهارشنبه 29 خرداد 1392, 11:01 صبح
آقای tooraj_azizi_1035
بنده با نسخه 2008R2 دیتابیسم را ایجاد کردم
انشاءالله بعد از تغییر ورژن حتما در پروژه هام از این قابلیتی که فرمودید استفاده می کنم
وقت بگم اگه بخواهی دیتابیس رو از 2008 به 2012 ارتقاع بدی دیگه قابل برگشت به 2008 نیست و دیگه با سکول سرور 2008 می توانه ای برگردی جز اینکه قبل از آبدیت کردن دیتابیست از 2008 به 2012 یه کپی ازش بگیری منم میخوام با دات نت 2012 و اسکلو سرور 2012 کار کنم ولی مشکلی دارم چون همه فایل ها کمکی که دارم با اسکول سرور 2008 باز میشه و دات نت 2010 بدون هیچ مشکلی ولی اگه با دانت و اسکل سرور 2012 باز کنم دیگه اجراری برای پروژم ندارم تا ببنیم کدام پروژه کار میکنه و هر کدامش چی کاری رو انجام میده من همچین مشکلی رو با 2012 بر خورد کردم ولی قبلش از فایل هم کپی گرفته بودم 2 تا داشتماز فایل ها تا تونستم به اطلاعات دسرسی داشته باشم و ببینم.

cse.Abdali
چهارشنبه 29 خرداد 1392, 13:52 عصر
وقت بگم اگه بخواهی دیتابیس رو از 2008 به 2012 ارتقاع بدی دیگه قابل برگشت به 2008 نیست و دیگه با سکول سرور 2008 می توانه ای برگردی جز اینکه قبل از آبدیت کردن دیتابیست از 2008 به 2012 یه کپی ازش بگیری منم میخوام با دات نت 2012 و اسکلو سرور 2012 کار کنم ولی مشکلی دارم چون همه فایل ها کمکی که دارم با اسکول سرور 2008 باز میشه و دات نت 2010 بدون هیچ مشکلی ولی اگه با دانت و اسکل سرور 2012 باز کنم دیگه اجراری برای پروژم ندارم تا ببنیم کدام پروژه کار میکنه و هر کدامش چی کاری رو انجام میده من همچین مشکلی رو با 2012 بر خورد کردم ولی قبلش از فایل هم کپی گرفته بودم 2 تا داشتماز فایل ها تا تونستم به اطلاعات دسرسی داشته باشم و ببینم.
نه منظور من پروژه های بعدیم بود. ممنون از تذکرتون