PDA

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



Iran58
شنبه 03 فروردین 1392, 11:03 صبح
سلام
من می خواهم برای اولین بار در جدول برنامه ام داده وارد کنم و کد زیر را نوشته ام

private void FrmCustomerAdd_Load(object sender, EventArgs e)
{
using (ShopDataContext db = new ShopDataContext())
{
var LastId = (from rows in db.Customers
select rows.Id).Max();
if (LastId == null)
LastId = 0;
txtCode.Text = (LastId + 1).ToString();
}
}
اما ارور زیر را می دهد
The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type.

حال کد را باید چگونه تصحیح کنم

aghayex
شنبه 03 فروردین 1392, 11:10 صبح
دوست عزیز چون تیبل شما هنوز رکوردی نداره پس در نتیجه درخواست شما برای بزرگترین عدد برای ستون ای دی یک مقدار نول هست و چون نوع ستون ای دی شما از نوع اینت هست خطا می ده
راه کار : اگه ستون ای دی شما باید یک عدد پشت سرهم باشه identity اونو فعال کن تا خودش عدد تولید کنه و شما نیاز نیست موقع درج داده عدیدی به اون اختصاص بدید و خودش این کارو می کنه .

MardeKhoob
شنبه 03 فروردین 1392, 11:15 صبح
سلام
من می خواهم برای اولین بار در جدول برنامه ام داده وارد کنم و کد زیر را نوشته ام

private void FrmCustomerAdd_Load(object sender, EventArgs e)
{
using (ShopDataContext db = new ShopDataContext())
{
var LastId = (from rows in db.Customers
select rows.Id).Max();
if (LastId == null)
LastId = 0;
txtCode.Text = (LastId + 1).ToString();
}
}
اما ارور زیر را می دهد
The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type.

حال کد را باید چگونه تصحیح کنم

هر چند که کدتون جای بحث داره،اما

if (LastId == null)
{
LastId = 0;
txtCode.Text = (LastId + 1).ToString();
}

Iran58
شنبه 03 فروردین 1392, 12:11 عصر
هر چند که کدتون جای بحث داره،اما
سلام
ممنون از توجه تان
1)چه جای بحثی داره لطفا راهنمایی بفرمایید
2)کد شما هم تا حدودی همان کد من است

aghayex
شنبه 03 فروردین 1392, 17:16 عصر
من می خواهم برای اولین بار در جدول برنامه ام داده وارد کنم و کد زیر را نوشته ام



چیزی که من دیدم شبیه به فراخوانی داده هست تا درج
اگه فراخوانی هست که همون جوابی رو که در بالا بهتون داده بودم هست اما اگه درج هست که کلا اشتباه رفتی

Iran58
شنبه 03 فروردین 1392, 19:54 عصر
چیزی که من دیدم شبیه به فراخوانی داده هست تا درج
اگه فراخوانی هست که همون جوابی رو که در بالا بهتون داده بودم هست اما اگه درج هست که کلا اشتباه رفتی
سلام
ممنون
هدفم اینه که اول چک کنم ببینم داده ای وجود دارد یا نه در بانک اگر نبود شماره اول را 0 و اگر بود max+1 کنه
که این جطا بروز پیدا می کنه
اگر شما کد نمونه دارید قرار دهید تا مشکل ما هم حل شود

aghayex
شنبه 03 فروردین 1392, 23:20 عصر
دوست من شما همون طور که در پست دوم گفتم بگید که این ستون ای دی شما یک عدد هست که باید توط کاربر وارد بشه مثل کد ملی یا کد پرسنلی و یا اینکه یک ستون هست که مقادیر اون یکتا هست و خودتون اونو درست کردید برا اتصال به جداول ؟
اگر هدف از ساخت اون ستون مورد اول هست که اصلا نیاز به این کارها نیست و بخواهید بزرکترشو گیر بیارید و بعلاوه ی یکش کنید .( که فکر کنم منظورتون این نیست )
اگر هدفتون مورد دوم هست که اصلا یاز نیست شما در هنگام درج مقداری به این ستون اختصاص بدید و کافیه بقیه ستون ها رو مقدار دهی کنید و کاری به کار این ستون نداشته باشید اما به شرطی که نوع داده این ستون ای دی از نوع اینت قرار بدید و خصوصیت identity اونو فعال کنید تا خودش عدد رو تولید کنه
و در آخر هم بعد از درج رکورد مقدار این ستون رو خواستید از دیتابیس بگیرید

علت این خطا تون هم اینه که شما دستور به دیتابیس دادید که بزرگترین عدد این ستون رو پیدا کنید و چون این جدول هنوز رکوردی رو نداره جدول برا این ستون مقدار null رو می ده و تابع ماکس null رو قبول نداره و این یه خطا هست
تذکر : مشکل شما با ارائه کد حل نمی شه

Hajivandian
دوشنبه 05 فروردین 1392, 14:19 عصر
سلام

private void FrmCustomerAdd_Load(object sender, EventArgs e)
{
using (ShopDataContext db = new ShopDataContext())
{
var LastId = (from rows in db.Customers
select (int?)rows.Id).Max() ?? 0;

txtCode.Text = (LastId + 1).ToString();
}
}

Iran58
دوشنبه 05 فروردین 1392, 16:11 عصر
سلام

private void FrmCustomerAdd_Load(object sender, EventArgs e)
{
using (ShopDataContext db = new ShopDataContext())
{
var LastId = (from rows in db.Customers
select (int?)rows.Id).Max() ?? 0;

txtCode.Text = (LastId + 1).ToString();
}
}
مهندس جان میشه در مورد کد بالا بخصوص علامت سوالها توضح بدهید

Hajivandian
دوشنبه 05 فروردین 1392, 18:06 عصر
در حالت عادی نوع هایی مثل int, byte, float, ... توانایی ذخیره مقدار null رو ندارن.

int a = null; این خط دارای خطا است

با استفاده از نماد ؟ (http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx) میشه توانایی ذخیره null رو به این نوع ها داد؛ که به این انواع Nullable Types گفته میشه.

int? a= null; این خط کاملا صحیح است

همچنین خط بالا در اصل کوتاه شده خط پایینه:

Nullable<int> a= null; این خط کاملا صحیح است

مقدار برگشتی دستوراتی مانند Max, Min, Sum, ... در Linq در حالت عادی بسته به نوع منبع داده میتونه int, float, ... باشه؛ در این حالت، منبع داده باید شامل حداقل یک رکورد باشه در غیر اینصورت برنامه با خطا مواجه میشه. برای رفع این مشکل کافیه توی کوئری لینکی که میزنیم نوع داده رو با یک عملیات Casting (http://msdn.microsoft.com/en-us/library/ms173105(v=vs.80).aspx) به یکی از انواع نال پذیر تبدیل کنیم:

int a = 0;
var b = (int?)a;

با این کار به دستورات لینک این توانایی رو میدیم که در صورت برخورد با خطا بتونن مقدار متغیر برگشتی رو با null تنظیم کنن.

در انتها هم برای بررسی مقادیر null میشه از عملگر ؟؟ (http://msdn.microsoft.com/en-us/library/ms173224.aspx) استفاده کرد:

var a = null;
var b = a ?? 0;

توی کد بالا اومدیم گفتیم که اگر متغیر a برابر با null بود، مقدار 0 رو در متغیر b بریز؛ در غیر اینصورت مقدار a رو برای متغیر b در نظر بگیر. کد بالا معادل کد زیر است:

var a = null;
var b = 0;
if ( a != null ) b = a;


همچنین کد بالا رو به صورت زیر هم میشه نوشت:
عملگر ؟: (http://msdn.microsoft.com/en-us/library/ty67wk28(v=vs.80).aspx)

var a = null;
var b = a != null ? a : 0;

بنازم به سی شارپ با این انعطافش! اونوقت هی جاوا رو میزنن تو سرش!! :افسرده:

gwbasic
دوشنبه 05 فروردین 1392, 22:52 عصر
عنوان نامناسب و کلی!!!
لطفا متن خطا رو در عنوان تاپیک مطرح کنید

ASKaffash
سه شنبه 06 فروردین 1392, 07:34 صبح
سلام
در قسمت (from rows in db.Customers select rows.Id) مقدار برای اولین بار DBNull است بنابراین Max بی معنی است پس اول چک کنید که محتوای برگشتی DBNull نباشد بعد Max بگیرید در غیر اینصورت متغیر LastId را به صفر Set کنید