PDA

View Full Version : سوال: خطا در ثبت اطلاعات در دیتابیس



h.rezaee
پنج شنبه 24 اسفند 1391, 11:49 صبح
سلام به دوستان. چنتا سوال داشتم ممنون میشم اگه جواب بدین.
1. بنده از جدول های رابطه ای برای ذخیره اطلاعات در دیتابیس استفاده می کنم. مشکل اول بنده اینه که چه جوری برای جدول main که جدول اصلی هستش و همه 8 تا ستونش از نوع bigint هستش رو با یک آیدی مشخص، با هم برابر کنم.
برای مثل ، بنده یه فردی رو با مشخصات زیر قرار میدم.
نام : علی نام خانوادگی : احمدی نام پدر : ولی شماره شناسنامه :123 ش.م : 123 تاریخ تولد :1/7/71 .......
ببینید برای نام و نام خانوادگی و نام پدر جدولی قرار دادم به اسم nametbl که یه id داره ( که در تصویر پایین نوشته id ولی در جدولی که الان در دیتابیس قرار دادم به اسم idname ) هستش که key هستش و identity اون هم true هستش. و بقیه جداول هم به همین ترتیب که id اون به صورت key و identity = yes هستش.
حالا میخوام این مقادیر id رو که برای همه جدول ها قرار دادم رو در جدول main هم برابر قرار بدم تا رابطه درست برقرار بشه . در جدول main ، آیدی مربوط به جدول name به ستون nameid جدول main متصله! و بقیه هم به همین ترتیب. حالا این identity برای id جدول main بله میشه ولی نمی دونم چه جوری باید این identity رو هم دوباره برای بقیه مقادیر yes کنم تا همه مقادی بشه مثلا 1 تا بقیه کارا درسا از آب در آد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

2.بنده برای اتصال به دیتابیس از کوئری زیر استفاده می کنم.

Data Source=.\SQLEXPRESS;AttachDbFilename="vizhefajr.mdf";Integrated Security=True;Connect Timeout=30;User Instance=True

و این هم کدهای مربوط به ثبت اطلاعات در دیتابیس :

SqlConnection objconnection = new SqlConnection(textBoxX1.Text);
DataSet das = new DataSet();
DataView objdataview = new DataView();
SqlCommand com = new SqlCommand();


if (nametxt.Text == string.Empty & lnametxt.Text == string.Empty & fnametxt.Text == string.Empty & shnumtxt.Text == string.Empty)
{
MessageBox.Show("عبارت خود را وارد کنید.");
}
else
{

objconnection.Open();
com.Connection = objconnection;
com.CommandText = "Insert INTO nametbl " +
"(name, lname, fname) " +
"VALUES(@name, @lname, @fname);" +
"Insert INTO numtbl " +
"(shnum, mnum, birthday) " +
"VALUES(@shnum, @mnum, @birthday);" +
"Insert INTO phonetbl " +
"(phonenum, mobilenum) " +
"VALUES(@phonenum, @mobilenum);" +
"Insert INTO informationtbl " +
"(job, education, army) " +
"VALUES(@job, @education, @army);" +
"Insert INTO addresstbl " +
"(address) " +
"VALUES(@address);" +
"Insert INTO membertbl " +
"(dateozv, hozename, paygahname, filenum) " +
"VALUES(@dateozv, @hozename, @paygahname, @filenum);" +
"Insert INTO codetbl " +
"(byganicode) " +
"VALUES(@byganicode)" +
"Insert INTO maintbl " +
"(datesave) " +
"VALUES(@datesave)";
com.Parameters.AddWithValue("@name", nametxt.Text);
com.Parameters.AddWithValue("@lname", lnametxt.Text);
com.Parameters.AddWithValue("@fname", fnametxt.Text);
//Insert into NUMTBL
com.Parameters.AddWithValue("@shnum", shnumtxt.Text);
com.Parameters.AddWithValue("@mnum", mnumtxt.Text);
com.Parameters.AddWithValue("@birthday", yearbirthtxt.Text + '/' + monthbirthtxt.Text + '/' + datebirthtxt.Text);
//Insert into phonenum
com.Parameters.AddWithValue("@phonenum", phonenumtxt.Text);
com.Parameters.AddWithValue("@mobilenum", mobilenumtxt.Text);
//Insert into informationtbl
com.Parameters.AddWithValue("@job", jobtxt.Text);
com.Parameters.AddWithValue("@education", educationtxt.Text);
com.Parameters.AddWithValue("@army", armytxt.Text);
//Insert into addresstbl
com.Parameters.AddWithValue("@address", addresstxt.Text);
//Insert into membertbl
com.Parameters.AddWithValue("@dateozv", yearozvtxt.Text + '/' + monthozvtxt.Text + '/' + dateozvtxt.Text);
com.Parameters.AddWithValue("@hozename", hozenametxt.Text);
com.Parameters.AddWithValue("@paygahname", paygahnametxt.Text);
com.Parameters.AddWithValue("@filenum", filenumtxt.Text);
//Insert into biyganicode
com.Parameters.AddWithValue("@byganicode", biyganinum.Text);
//Insert into membertbl
com.Parameters.AddWithValue("@datesave", labelX1.Text);


try
{
com.ExecuteNonQuery();
MessageBox.Show("اطلاعات با موفقیت ثبت شد");
nametxt.Clear();
}
catch(SqlException sqlERR)
{
MessageBox.Show(sqlERR.Message);
}
}

مشکلش این هکه میزنه اطلاعات با موفقیت ثبت شد ولی در دیتابیس هیچ چیز ثبت نمیشه؟؟؟؟؟
البته این رو هم بگم که بانک اس کیو ال سرور 2008 سرویس پک 2 رو از طریق data/Add new database source ..... برنامه ویژوال استودیو 2010 به برنامه اضافه کردم. و از داخل هم گزینه Entity data ..... رو انتخاب کردم.

h.rezaee
پنج شنبه 24 اسفند 1391, 16:45 عصر
یعنی واقعا کسی نیست حداقل سوال اولم رو جواب بده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟

veniz2008
پنج شنبه 24 اسفند 1391, 17:03 عصر
یعنی واقعا کسی نیست حداقل سوال اولم رو جواب بده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟
مشکل در فهم مساله هست. من میگم شما تصحیح کن هرجا رو اشتباه گفتم:
شما یه جدول main داری که در واقع فیلدهاش همه کلید خارجی هست. یعنی از هر جدولی کلیدش رو برداشتی و داخل این جدول ذخیره کردی و واسه همین جدول main هم یک id گذاشتی که کلید هست و identity اونم yes هست. این قسمت حرفهاتون رو متوجه نمیشم :

حالا این identity برای id جدول main بله میشه ولی نمی دونم چه جوری باید این identity رو هم دوباره برای بقیه مقادیر yes کنم تا همه مقادی بشه مثلا 1 تا بقیه کارا درسا از آب در آد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
بیشتر توضیح بدید(با مثال مفهومتون رو برسونید).

h.rezaee
پنج شنبه 24 اسفند 1391, 18:05 عصر
قبل از هر چیز خیلی ممنون که به سوالم توجه کردین.
شرمنده اگه دیر جواب میدم. داشتم عکس ها رو آماده می کردم.
دوست عزیز ، بزار با عکس واضح تر بهتون توضیح بدم.
ببینید طبق عکس اسم حسین رضایی نام پدر علی در دیتابیس ذخیره شده ، درسته ؟؟؟؟؟؟؟؟؟؟
که id = 1 هستش. و همین جور بقیه جدول ها با id = 1 ستونشون دونه دونه پر میشه.
بعد باید توی جدول main هم این عدد 1 رو به همه ستونها نسبت بدیم تا بتونه موقع سرچ ( جستجو ) تمامی رکورد هایی رو که دارای id = 1 هستن رو طبق کوئری زیر پیدا کنه.

com.CommandText = "Select name, shnum from dbo.nametbl " +
"JOIN maintbl ON nametbl.idname = maintbl.nameid " +
"JOIN numtbl ON numtbl.idnum = maintbl.numid " +
"WHERE (name=@name)";
com.Parameters.AddWithValue("@name", searchtxt.Text);

ببینید قبلا من تونستم این identity رو برای همه ستونهای جدول main برابر yes کنم ولی میخواستم برای برنامه setup بسازم برای زمینه کردن دیتابیس باید اون رو با .\SQLEXPRESS کانکت می کردم که این باعث شده تا یه بار دیگه دیتابیس رو در .\sqlexpress طراحی کنم . ( یعنی نمی خواستم طراحی کنم ولی موقع اتچ کردن با خطا مواجه شدم که می گفت ورژن دیتابیس به آن نمیخوره و .....)
باز هم توضیح خواستین در خدمتم.
باز هم ممنون

h.rezaee
پنج شنبه 24 اسفند 1391, 18:10 عصر
دوست عزیز این هم عکس تا واضح تر بشه.

h.rezaee
پنج شنبه 24 اسفند 1391, 18:30 عصر
مشکل در فهم مساله هست. من میگم شما تصحیح کن هرجا رو اشتباه گفتم:
شما یه جدول main داری که در واقع فیلدهاش همه کلید خارجی هست. یعنی از هر جدولی کلیدش رو برداشتی و داخل این جدول ذخیره کردی و واسه همین جدول main هم یک id گذاشتی که کلید هست و identity اونم yes هست. این قسمت حرفهاتون رو متوجه نمیشم :

بیشتر توضیح بدید(با مثال مفهومتون رو برسونید).
دوست عزیز این هم رابطه. فکر کنم دیگه واضح باشه؟؟؟؟؟؟؟؟؟؟؟

veniz2008
پنج شنبه 24 اسفند 1391, 18:52 عصر
من بازم متوجه منظور شما نشدم ولی بذارید یه نکته ای رو بگم.
ما وقتی میخوایم گزارش بگیریم بر حسب یک یا چند فیلد این کار رو انجام میدیم. مثلا میگیم لیست تمام خریدهای یک شخص (یعنی UserID واسمون مهمه) یا لیست خریدهای یک شخص در فلان بازه زمانی. در اینصورت UserID و تاریخ شروع و تاریخ پایان مهمه. شما از join کردن این جداول دنبال چی هستی؟.چه گزارشی رو مد نظرت هست؟

veniz2008
پنج شنبه 24 اسفند 1391, 18:55 عصر
تمام این جداول مربوط به موجودیت یوزر هست؟

Mahmoud.Afrad
پنج شنبه 24 اسفند 1391, 19:36 عصر
نکته اصلی اینه که identity کلیدهای خارجی اصلا نباید yes باشه. خودتون باید کلیدهای خارجی رو مقداردهی کنید.
من هم این سوال برام پیش اومده: تمام این جداول مربوط به موجودیت یوزر هست؟

هر موجودیت باید یک جدول باشه.
رابطه هم بین موجودیت ها برقرار میشه.
اگر قراره کلیدهای خارجی به ترتیب زیاد بشن اصلا چه لزومی به ایجاد جدول های مجزا هست. میتونید اطلاعات مرتبط رو در یک جدول قرار بدید.

h.rezaee
پنج شنبه 24 اسفند 1391, 21:46 عصر
نه! فکر کنم اشتباه شده.
ببینید بنده برای این که جدول ها بیش از حد سنگین نشه اومدم این کار رو پیاده سازی کردم . یعنی نخواستم اون همه ستون با هم در یک جدول قرار بگیره ، که باعث کم شدن سرعت و .... بشه.
حالا ببنید این ایده بنده بود اگه راه بهتری هم هست برای این کار بگید?

h.rezaee
پنج شنبه 24 اسفند 1391, 22:06 عصر
تمام این جداول مربوط به موجودیت یوزر هست؟
دوست عزیز فکر کنم باز هم اشتباه شده.
ببینید بنده یه بار نحوه عملکر برنامه رو میگم احتمالا بنده دیتابیس رو اشتباهی طراحی کردم.
ببینید این برنامه برای یه شرکته که می خواد اسامی و مشخصات کرمنداشون رو از اولین روز تاسیسش یعنی سال 1340 تا به امروز با کلی پرونده و ..... تو دیتابیسش ذخیره کنه.
اول یه فرمی می خواد که شامل نام ، نام خانوادگی و ...... باشه و این جور اطلاعات رو بگیره . بعد میخواد وارد یه فرمی بشه که بتونه عکس های اسکن شده مربوط به هر شخص رو درون دیتابیس ذخیره کنه.البته این رو هم بگم که تعداد عکس ها واسه هر شخصی فرق میکنه . یکی 3تاست یکی 20تا!!!!!!!!!!
بعد یه قسمت جستجو داشته باشه که بتونه بر اساس سه حالت افراد رو جستجو کنه و با کلیک بر روی اسمش یا همون مشخصات اولیه فرد کلیه مشخصاتش رو ببینه .
همچنین امکان ویرایش و حذف هم بر اساس کد خواصی رو فقط و فقط به ادمین بده.
بعد یه گزارش گیری داشته باشه که وقتی ادمین بر روی از تاریخ 12/6/91 تا 12/12/91 کلیک کرد تعداد افراد وارد شده رو نشون بده.
حالا طبق ایم کار بنده اومدم برای جلوگیری از افزونگی و سنگینی بیش از حد جداول و دیتابیس این کار رو کردم که نام ،نام خانوادگی ، نام پدر بره تو یه جدول و بقیه هم به همین ترتیب.

h.rezaee
پنج شنبه 24 اسفند 1391, 22:06 عصر
نکته اصلی اینه که identity کلیدهای خارجی اصلا نباید yes باشه. خودتون باید کلیدهای خارجی رو مقداردهی کنید.
من هم این سوال برام پیش اومده: تمام این جداول مربوط به موجودیت یوزر هست؟

هر موجودیت باید یک جدول باشه.
رابطه هم بین موجودیت ها برقرار میشه.
اگر قراره کلیدهای خارجی به ترتیب زیاد بشن اصلا چه لزومی به ایجاد جدول های مجزا هست. میتونید اطلاعات مرتبط رو در یک جدول قرار بدید.
دوست عزیز ممنون که توجه کردین.

veniz2008
پنج شنبه 24 اسفند 1391, 23:19 عصر
نه! فکر کنم اشتباه شده.
ببینید بنده برای این که جدول ها بیش از حد سنگین نشه اومدم این کار رو پیاده سازی کردم . یعنی نخواستم اون همه ستون با هم در یک جدول قرار بگیره ، که باعث کم شدن سرعت و .... بشه.
یه سوال دوست من : افزونگی یعنی چی؟
طراحیتون کاملا اشتباهه. با توجه به توضیحاتتون برای یوزر دو تا جدول نیاز دارید. یکیش شامل تمام فیلدها اون جداول میشه که کلیدش میشه نام کاربری. و جدول دوم هم برای ذخیره عکس در نظر بگیرید که دو تا فیلد داره: یکی نام کاربری و دومی مثلا userImage واسه ذخیره عکس.


دوست عزیز فکر کنم باز هم اشتباه شده.
ببینید بنده یه بار نحوه عملکر برنامه رو میگم احتمالا بنده دیتابیس رو اشتباهی طراحی کردم.
ببینید این برنامه برای یه شرکته که می خواد اسامی و مشخصات کرمنداشون رو از اولین روز تاسیسش یعنی سال 1340 تا به امروز با کلی پرونده و ..... تو دیتابیسش ذخیره کنه.
اول یه فرمی می خواد که شامل نام ، نام خانوادگی و ...... باشه و این جور اطلاعات رو بگیره . بعد میخواد وارد یه فرمی بشه که بتونه عکس های اسکن شده مربوط به هر شخص رو درون دیتابیس ذخیره کنه.البته این رو هم بگم که تعداد عکس ها واسه هر شخصی فرق میکنه . یکی 3تاست یکی 20تا!!!!!!!!!!
بعد یه قسمت جستجو داشته باشه که بتونه بر اساس سه حالت افراد رو جستجو کنه و با کلیک بر روی اسمش یا همون مشخصات اولیه فرد کلیه مشخصاتش رو ببینه .
همچنین امکان ویرایش و حذف هم بر اساس کد خواصی رو فقط و فقط به ادمین بده.
بعد یه گزارش گیری داشته باشه که وقتی ادمین بر روی از تاریخ 12/6/91 تا 12/12/91 کلیک کرد تعداد افراد وارد شده رو نشون بده.
حالا طبق ایم کار بنده اومدم برای جلوگیری از افزونگی و سنگینی بیش از حد جداول و دیتابیس این کار رو کردم که نام ،نام خانوادگی ، نام پدر بره تو یه جدول و بقیه هم به همین ترتیب.
یادتون نره که یک فیلد تاریخ هم واسه جدول کاربر بذارید چون واسه جستجو بهش نیاز دارید.
تعداد کارمندان از سال 40 تا الان چندتا میشه؟. 100 هزار ؟ 1 میلیون؟ چقدر؟
لینک زیر رو هم حتما ببینید چون به درد کار شما میخوره :
http://barnamenevis.org/showthread.php?373448-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B9%DA%A9%D8%B3-%D8%A8%D9%87-%D8%B7%D9%88%D8%B1-%D9%86%D8%A7%D9%85%D8%AF%D9%88%D8%AF-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3&highlight=%D8%B0%D8%AE%DB%8C%D8%B1%D9%87+%D8%B9%DA %A9%D8%B3

h.rezaee
جمعه 25 اسفند 1391, 12:12 عصر
یه سوال دوست من : افزونگی یعنی چی؟
باز هم ممنون. منظورم از افزونگی یعنی اینکه تعداد اطلاعات خیلی زیاد باشه که موقع سرچ و حذف و ویرایش سرعت برنامه رو بیاره پایین.

طراحیتون کاملا اشتباه
خودم هم حدس میزدم که اشتباه باشه چون تجربه کافی ندارم.
ولی حالا از شما می خوام خواهش کنم بگید که چه جوری این دیتابیس رو طراحی کنم.
آیا یک دونه جدول برای ثبت کل مشخصات کافیه ؟؟؟؟؟؟؟؟؟؟؟؟؟
یا این که اگر راهکاری دارید بگید ممنون میشم.

h.rezaee
جمعه 25 اسفند 1391, 17:02 عصر
از دوستان دیگه هم ممنون میشم اگه راهنمایی کنن

veniz2008
جمعه 25 اسفند 1391, 21:46 عصر
منظورم از افزونگی یعنی اینکه تعداد اطلاعات خیلی زیاد باشه
نه دوست من. به این نمیگن افزونگی. افزونگی یعنی درج تکراری و بیهوده داده در جدول. در لینکی که گذاشته بودم در قالب یک مثال بطور کامل توضیح داده بودم.


ولی حالا از شما می خوام خواهش کنم بگید که چه جوری این دیتابیس رو طراحی کنم.
آیا یک دونه جدول برای ثبت کل مشخصات کافیه ؟؟؟؟؟؟؟؟؟؟؟؟؟
شما به سوال من جواب ندادید. تعداد کارمندان از روز اول تا الان چه تعداد میشه؟. آیا تعداد کل عکس هایی که باید واسه تمام کارمندان ثبت بشه تقریبا مشخصه که چندتاست؟
با توجه به اینکه گفتید واسه هر شخص بیش از 1 عکس وجود داره و تعداد عکس های اشخاص هم متفاوت هست پس به هیچ عنوان بهینه نیست که فقط 1 جدول داشته باشید.

docendo
جمعه 25 اسفند 1391, 22:43 عصر
با درود

یک ایرادی که میتونه تداخل کنه اینکه توی کوئری id برای همشان یکسان است
بهتره id ها مانند زیر بنویسید

idinfo
idphon
idmem
idadd
idnum
ووووو

شاید درست شود

linux
جمعه 25 اسفند 1391, 23:15 عصر
لقمه را دور سرت گردوندی عموجان!
اصطلاحات اینکه جدول سنگین بشه و ... مال میدان میوه فروش‌هاست نه انجمن برنامه نویسها اینجا هر کار غیر منطقی باعث پیچیده‌تر شدن و کندی خواهد شد.
یک نفر مگر چندتا شماره شناسنامه و تاریخ تولد دارد که در جدول دیگر ذخیره شود و جداول ۱ به ۱ هم کلی باید دلیل داشته باشی تا ایجادشون کنی.
موجودیت یوزر ی همان maintbl شما می تواند شامل این فیلدها شود
۱- کدکاربر از نوع عدد و منحصربفرد
۲- نام
۳- نام خانوادگی
۴- نام پدر
۵- شماره شناسنامه
۶- تاریخ تولد
۷- کد ملی
. سایر اطلاعات شناسنامه ای در صورت نیاز ....
جدول تلفنها - به این دلیل درست شده است که ممکن هست کسی بیش از یک شماره تماس داشته باشد
۱- کد منحصربفرد عدد
۲- کدکاربر (از جدول کاربرها)
۳- نوع تماس عدد (مثلا برای موبایل ۱و برای تلفن ثابت ۲، برای ایمیل ۳ و....)
۴- مقدار
جدول آدرسها( به این دلیل که ممکن هست یک نفر بیش از یک آدرس داشته باشد.
تقریبا مثل جدول تماسها
جدول infotbl شما همان طور بد نیست چون ممکن کسی وضیعت نظام وظیفه‌اش تغییر کند، یا وضیعت مدرک تحصیلی بهتر هست که یک فیلد تاریخ هم بگذارید. در صورتی این جدول بکار شما خواهد آمد که تاریخچه اطلاعات کسی را ذخیره کنید، فرض کنید تو سیستم شما تغییر وضیعت مدرک تحصیلی مهم باشد.

h.rezaee
شنبه 26 اسفند 1391, 01:11 صبح
خیلی ممنون ولی یه مشکل دیگه هم هستش اونم نحوه ست کردن id هستش، یعنی اگه بخوابم با identity کار کنیم اون موقع به مشکل اساسی می خوریم، ممکنه یه تیکه کدی چیزی بزارید برای id که غیر عز identity کار کنه

h.rezaee
شنبه 26 اسفند 1391, 01:15 صبح
با درود

یک ایرادی که میتونه تداخل کنه اینکه توی کوئری id برای همشان یکسان است
بهتره id ها مانند زیر بنویسید

idinfo
idphon
idmem
idadd
idnum
ووووو

شاید درست شود
دوست عزیز ممنون عز توجهتون اگه دقت میکردیم بالا نوشتم که این id هآیی که نوشته شده به همون صورتی هستش که شما گفتین یعنی واسه name نوشته شده idname و بقیه هم به همین ترتیب

h.rezaee
شنبه 26 اسفند 1391, 01:20 صبح
نه دوست من. به این نمیگن افزونگی. افزونگی یعنی درج تکراری و بیهوده داده در جدول. در لینکی که گذاشته بودم در قالب یک مثال بطور کامل توضیح داده بودم.

شما به سوال من جواب ندادید. تعداد کارمندان از روز اول تا الان چه تعداد میشه؟. آیا تعداد کل عکس هایی که باید واسه تمام کارمندان ثبت بشه تقریبا مشخصه که چندتاست؟
با توجه به اینکه گفتید واسه هر شخص بیش از 1 عکس وجود داره و تعداد عکس های اشخاص هم متفاوت هست پس به هیچ عنوان بهینه نیست که فقط 1 جدول داشته باشید.

ممنونم. بله عینکی که گذاشته بودید رو خوندم تقریبا کامل بود.
اگر غلط املایی هستش ببخشید چون با گوشی دارم می نویسم.
عکس ها هم برای هر کارمند مشخص نیست البته برای کارمند های جدید تمامی فرم ها 4 تا برگه داره کلی برای کارمندهای قبل عز سال 84 یه خورده نا منظم هستش