PDA

View Full Version : خطا بعد از ورود اطلاعات constainException



gilaseabi
چهارشنبه 28 فروردین 1392, 13:07 عصر
سلام دوستان
من یه برنامه طراحی کردم که وقتی اون رو اجرا می کنم و اطلاعات وارد میکنم هیچ خطایی نمیده و اطلاعات رو در دیتا گرید ویو نشون میده ولی به محض اینکه برنامه رو ببندم و یکبار دیگه اجرا کنم خطای زیر رو میده و تنها کاری که میتونم بکنم اینه که اطلاعاتی که وارد کردم رو از طریق sql پاک کنم و یکبار دیگه برنامه رو اجرا کنم و با ورود اطلاعات جدید باز هم همون مشکل پیش میاد.
لطفا راهنماییم کنید . مرسی.
constraintException was unhandled
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

littledemon
چهارشنبه 28 فروردین 1392, 13:19 عصر
علیک سلام
اول یه چیز : Relation تعریف کردی تو دیتابیس ؟
دوم : کدت رو بزار ببینیم چه کردی !
سوم : فکر میکنم یه محدودیتی قائل شدی واسه فیلد ها تو SQL که اینجا یه مشکلی باهاش هست . و نمیتونه متوجه بشه . مثل همون محدودیت ها که امکان داره یه فیلد Null که البته نباید تو دیتا بیس نال باشه رو سعی داری بخونی .

این اتفاق کی میافته ؟ یعنی فقط یه سری داده رو میای میخونی ؟ یا بعد روش تغییری میدی ؟

gilaseabi
چهارشنبه 28 فروردین 1392, 13:32 عصر
منظورتون رو از سوال اول متوجه نشدم؟؟ توی sql فقط جدول طراحی کردم و با کدنویسی ارتباط به جدولم رو تعریف کردم .
این خطا رو به کدی که به صورت خودکار بعد از اتصال به دیتابیس به برنامه تو قسمت form load اضافه میشه میگیره یعنی این کد
this.infoTableAdapter.Fill.(this.cipDataSet1.info) ;
این هم کد کلید ثبت اطلاعاتم




















string s;
string n;
string p;
SqlConnection con = newSqlConnection();

con.ConnectionString =
@"Data Source=.;Initial Catalog=cip;Integrated Security=True";
SqlCommand cmd = newSqlCommand();
if (radioButton1 .Checked== true )
s =
"زن";
else
s =
"مرد";
if (radioButton3.Checked == true)

p =
"ورودی";
else
p =
"خروجی";
if (radioButton5.Checked == true)

n =





"داخلی";





else

n =





"خارجی";



string sqlstr=string.Format("insert into info(name, family, date, [sh parvaz], maghsad, [air name], pardakht, [sh tell], [tedad mostaghbel], [mablagh daryafti-mosafer], [mablagh daryafti-hamrah], [saate parvaz], parvaz, [noe parvaz], jensiat, [code marja])values('{0}','{1}','{2}',{3},'{4}','{5}','{6}',{7 },{8},{9},{10},'{11}','{12}','{13}','{14}','{15}')" ,textBox1 .Text,textBox2 .Text ,dateTimePicker1 .DateValue ,Int32 .Parse (textBox3 .Text),textBox5 .Text ,comboBox1 .Text , comboBox2 .Text ,textBox6 .Text , Int32 .Parse (textBox7 .Text ),Int32 .Parse (textBox8 .Text ),Int32 .Parse (textBox9 .Text ),textBox4 .Text , p,n , s , listBox1 .Text) ;

con .Open ();

cmd.CommandText = sqlstr ;

cmd .Connection = con ;

cmd.ExecuteNonQuery ();

con.Close ();

vs();












فقط اطلاعات ثبت میکنم و هیچ تغییرات دیگه ای نمیدم به محض بستن و باز کردن برنامه این خطا رو میده .

littledemon
چهارشنبه 28 فروردین 1392, 14:20 عصر
خوب شما تعاریف فیلد های دیتابیست رو بنویس . هر فیلد با نوع . و آیا nullable هست یا مثلا کلیده یا نه و ... فکر میکنم یه اشتباهی توش باشه ...
به طور کلی محدودیت هایی که توی تعریف فیلد هات ایجاد کردی رو بیار تا بشه یه فکری کرد .
بعد هم یه چیز دیگه شما اداپتور رو داخل Form Load پر کردی . بعد از یک بار وارد کردن مقادیر داخل دیتابیس . برو داخل دیتا بیس (با خود SQL Managment) و سعی کن اون سطری که ایجاد کردی رو یکی از فیلد هاش رو تغییر بدی. مثلا مقدار یه فیلد رو عوض کن . حالا باید اونجا هم یه اروری دریافت کنی اگه مشکل از تعاریف جداول و یا تغییر در مقادیر فیلد ها باشه .

و بازم یه چیز دیگه : شما وقتی ثبت اطلاعات میکنی ، پشت سرش که اطلاعات رو تو دیتا گرید نشون میده با آداپتور از دیتا بیس دوباره میخونیش؟ یا همونجا از دیتا ست حاضر استفاده میکنی (یعنی قبلا خودت پرش کردی و نمیری از دیتا بیس بخونی دوباره )؟
کد ثبت اطلاعات مشکلی نداره !

gilaseabi
چهارشنبه 28 فروردین 1392, 14:41 عصر
هیچ محدودیت دیگه ای ندارن تمام کاری که تو دیتا بیس انجام دادم همینه، نام ستون و نوع آن ها
102970
بعد از ورود اطلاعات میتونم توی دیتابیس اطلاعاتم رو تغییر بدم و هیچ خطایی نمیده .
منظورتون رو از پر کردن اداپتور در Form-loadنفهمیدم ؟؟ من مبتدی هستم ، اگر براتون امکانش هست برام بیشتر توضیح بدید، در ضمن از راهنماییهاتون ممنونم .

littledemon
چهارشنبه 28 فروردین 1392, 15:55 عصر
خوب مشکلی نیست تو بحث دیتابیس هم ... لاقل این طور به نظر میرسه .
ببینم وقتی تو خود برنامه دیتا گرید رو پر میکنی ، با چه کدی این کار رو انجام میدی ؟ راسیاتش من هی دارم به کد هات مشکوک تر میشم :لبخند:

و این که کدت رو از Form Load اوردی بیرون تو یه دکمه ای چیزی ؟ ببین مشکل همونه یا نه ؟

gilaseabi
چهارشنبه 28 فروردین 1392, 20:45 عصر
ممنون که پیگیری میکنید و جواب میدید، راستیتش من کسی رو ندارم که سوال هام رو ازش بپرسم ، و تنها جایی که میتونم سوال بپرسم همین جاست ، مرسی که تنهام نمیذارید.
این هم کدی که دیتاگرید با اون پر میشه :
[CODE]

publicvoid vs()
{

dataGridView1.DataBindings.Clear();



SqlConnection sq=new SqlConnection();

sq.ConnectionString=

@"Data Source=.;Initial Catalog=cip;Integrated Security=True";



string strco = "select * from info";



SqlDataAdapter da=new SqlDataAdapter(strco,sq);



DataSet ds=new DataSet();

da.Fill(ds,

"info");

dataGridView1.DataBindings.Add(

new Binding("datasource", ds,"info" ));

}
[CODE/] شاید یه بار دیگه بشینم برنامه رو از اول بنویسم .:ناراحت:

littledemon
چهارشنبه 28 فروردین 1392, 23:08 عصر
خوب :
ببین این کدهات هم مشکلی نداره . میمونه آخرین قسمت که کدهای Form Load هست .
شما گفتی از این کد واسه خوندن اداپتور استفاده کردی :
this.infoTableAdapter.Fill.(this.cipDataSet1.info) ;
این cipDataSet1.info رو کجا بهش معرفی کردی ؟ ببین تا جایی که من میدونم شما وقتی میای و info رو از دیتاست صدا میزنی باید قبلش ایجادش کرده باشی و ساختارش رو هم احتمالا تعریف کرده باشی . که فکر میکنم از اینجا باشه . البته من هنوز کدهای این قسمتت رو ندیدم که بتونم قطعی بگم !
اگه کد های داخل فرم لود رو هم بذاری که چه بهتر . امیدوارم بتونم مشکلت رو شناسایی کنم .

راستی چرا از همون روش برای پر کردن دیتاست با آداپتور استفاده نمی کنی ؟ از این :
da.Fill(ds,"info");
احتمالا فردا صبح دیگه بیام سر بزنم.

phpeproject.ir
چهارشنبه 28 فروردین 1392, 23:15 عصر
مشکل ارتباط فیلد کلید خارجی در جدول دیگه میباشد

gilaseabi
پنج شنبه 29 فروردین 1392, 00:03 صبح
من تو هیج کدوم از جدول هام کلید ندارم ولی اطلاعاتی که توی یکی از ستون ها قرار میگیره از یکی از ستون های یه جدول دیگه که از توی لیست باکس انتخاب میشه ، اگر منظورتون اینه، باید چیکارش کنم ؟؟

و اینکه من تو form load کدی اضافه نکردم فقط متد رو صدا زدم :
[


private void Form1_Load(object sender, EventArgs e)

{

// TODO: This line of code loads data into the 'cipDataSet1.info' table. You can move, or remove it, as needed.


this.infoTableAdapter.Fill(this.cipDataSet1.info);

// TODO: This line of code loads data into the 'cipDataSet.codedaramad' table. You can move, or remove it, as needed.

this.codedaramadTableAdapter.Fill(this.cipDataSet. codedaramad);

vs();

}

littledemon
پنج شنبه 29 فروردین 1392, 11:48 صبح
خوب این یعنی کلید داری :لبخند:
خوب حالا فیلدی که داخل 2 تا جدول استفاده کردی در هر 2 جدول هم نام و از یک نوع هست ؟
مطلب بعدی این که آیا مقداری وجود داره که خونده بشه ولی در اون جدول فیلدش پر نشده باشه ؟
فرض کن تو جدول 1 داری :
m_id , m_name , m_phone
در جدول 2 داری :
m_id,m_work

حالا از جدول 1 , Select میکنی فیلدی که m_id اون برابر باشه با m_id در جدول 2
همچین حالتی داری تو دیتابیس دیگه انشالله ؟

-راستی نظر شخصی من : فعلا سعی کن واسه پر کردن دیتاست به صورت دستی عمل کنی .
منظورم


dataset ds=new dataset();
adaptor.Fill(ds,"Table");

gilaseabi
پنج شنبه 29 فروردین 1392, 14:57 عصر
ممنون که همراهیم کردید، مشکل حل شد. مشکل همنامی کلید خارجی بود :لبخند:
خیلی کمکم کردید، یک دنیا ممنون، :لبخندساده:دیگه میخواستم برنامه رو از اول بنویسم