PDA

View Full Version : وقتي Text box خالي باشد(مشكل با insert)



بیتافرهی
پنج شنبه 16 آبان 1387, 18:19 عصر
سلام
من دو تا جدول دارم
1-جدول tbl1_cpu كه شامل فيلد هاي id,model,name(كليد اصلي) است.(اين جدول اصلي است)
2- جدول tbl_computer_component ، كه اجزاي كامپيوتر را نگه مي دارد.يكي از فيلد هاي آن id_cpu_f است،كه اين فيلد از نوع int است و با فيلد id از جدول 1 ،كليد خارجي است.
(يعني اطلاعات id_cpu_f ،از طريق id جدول cpu تامين ميشود.)
مشكل من در رابطه با insert است .
وقتيكه جدول 1 خالي باشد،وقتيكه من توي فرمم كه در رابطه با وارد كردن اطلاعات در جدول 2 است،دكمهي insert را مي زنم با error زير مواجه مي شوم.


//////////////////////////////
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_tbl_computer_component_tbl1_cpu".
The conflict occurred in database "iso4", table "dbo.tbl1_cpu", column 'id'.
The statement has been terminated.كدي هم كه من نوشتم اين است:

SqlCommand objcommand = new SqlCommand();
objcommand.Connection = con;

objcommand.CommandText = "insert into tbl_computer_component " +
" (computer_idf,id_cpu_f)" +
"values(@computer_idf,isnull(@id_cpu_f,NULL))";///???

objcommand.Parameters.AddWithValue("@computer_idf", re_computer);



objcommand.Parameters.AddWithValue("@id_cpu_f", textBox2.Text);در واقع مشكل ماينجاست كه وقتي جدول 1 حالي باشد و من در فرمم كه مربوط به پر كردن جدول 2 است،Insert مي زنم،چون مقدار Text box اي كه تامين كننده ي اين فيلد است ،توش هيچي نوشته نشده ايراد مي گيره.من مقدار null گذاشتم isnull(@id_cpu_f,NULL) ولي باز هم ارور بالا را مي گيرد.
اشكال از كجاست؟

بیتافرهی
جمعه 17 آبان 1387, 11:25 صبح
من مي خوام وقتيكه كاربر توي TEXT BOX چيزي نمينويسه ،null فرستاده بشه.

SMRAH1
جمعه 17 آبان 1387, 11:38 صبح
سلام

در SQL SERVER ،وقتی یکی کلید جدول را ،خارجی معرفی کرده و به یک جدول دیگر مربوط می کنید (مثل فیلد id_cpu_f در جدول دوم)،SQL SERVER در موقع افزودن داده ها،این اعتبار سنجی را که باید کلید خارجی مذبور موجود باشد،انجام داده و در صورتی که چنین کلیدی وجود نداشته باشد(در مثال شما کلید id معادل در جدول 1 موجود نباشد)،اقدام به ایجاد خطا می کند.
برای رفع انی مشکل دو راه دارید:
1) ابتدا جدول 1 را پرکنید!بعد جدول 2 را!
2) از خیز معرفی کردن کلید خارجی id_cpu_f در جدول دوم به عنوان لینکی از جدول اول بگذرید!

نظر شخصی: من راه اول را پیبشنهاد می کنم،در واقع راه دوم ،عدم پایداری پایگاه داده (افزودن رکورد های بی مصرف) را می تواند به دنبال داشته باشد.

موفق باشید

رضا جاسبی
جمعه 17 آبان 1387, 23:34 عصر
من یک کمی با نظر شما مخالفم.
کلید خارجی در یک جدول می تواند مقدار null هم داشته باشد.
مشکلی که خانم فرهی برخورد کردند در واقع در کدشون به صورت هوشمندانه نوشته شده. یعنی خواستند که اگر اون فیلد مقداری نداشت null درج بشه. اما فکر کنم مشکل به دلیل این هست که رشته خالی یعنی "" با null فرق می کنه. فکر کنم اگر به جای تابع isnull خود متغیر id_cpu_f@ رو بذاری و در بخش Parameter از تکه کد زیر استفاده کنی مشکل حل بشه
(objcommand.Parameters.AddWithValue("@id_cpu_f", (textBox2.Text=="")?Null:textBox2.Text
البته من دو تا ایراد بزرگ به این کار دارم.
اول اینکه وقتی کلید خارجی تعریف می کنید حتی اگر سیستم ایراد نگیره منطق حکم می کنه که اول حدول اصلی رو پر کنید. و دوم اینکه به نظر من خیلی بهتره که اول شما خودت چک کنی که کلید خارجیت معتبر هست یا نه و در صورتی که معتبر نیست خودت یک پیغام خطای مناسب فارسی بدی نه اینکه اجازه بدی سیستم بهت ایراد بگیره و در بهترین حالت یک پیغام خطای انگلیسی و بدتر از اون به زبان کامپیوتر بدی که حتی شاید کامپیوتریست ها هم متوجه نشن چه برسه به کاربرای عادی. مشکل فعلی شما در مورد درج null هست. ولی اگر اون تکست باکس null نباشه و متن داشته باشه ولی متنش معتبر نباشه باز هم همون پیغام خطا رو خواهی داشت.