دسته بندی ها
13:30 1401/05/03

خطای Can't convert nvarchar to bigint در سی شارپ

مشخصات سوال کننده :
کاربر : mmr1401     امتیاز کاربر : 45     رتبه کاربر : 19
دسته بندی : WPF سی شارپ Sql Server Entity Framework

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 2924
هوش مصنوعی

پاسخ هوش مصنوعی

خطای "Can't convert nvarchar to bigint" معمولاً به خاطر این است که مقداری که به عنوان پارامتر به SQL Server ارسال می شود، با نوع داده مورد انتظار در پایگاه داده مطابقت ندارد. در کد شما، به نظر می رسد که پارامتر `RegisterationCode` به درستی به نوع `SqlDbType.BigInt` تبدیل نمی شود. احتمالاً مقدار موجود در `TextBox_RCode` نمی تواند به `Int64` تبدیل شود.

برای رفع این مشکل، می توانید پیش از تبدیل، چک کنید که مقدار ورودی قابل تبدیل باشد یا خیر. همچنین می توانید نوع داده `RParam` را به `SqlDbType.BigInt` مشخص کنید. به کد زیر توجه کنید:

private bool CheckDuplicate()
{      
   var dupN = new SqlParameter("DuplicateN", System.Data.SqlDbType.Bit)
   {
      Direction = System.Data.ParameterDirection.Output
   };
   var dupR = new SqlParameter("DuplicateR", System.Data.SqlDbType.Bit)
   {
      Direction = System.Data.ParameterDirection.Output
   };
   
   var NParam = new SqlParameter("Name", TextBox_Name.Text);
   long registrationCode;

   // بررسی اینکه آیا مقدار قابل تبدیل به Int64 است
   if (!long.TryParse(TextBox_RCode.Text, out registrationCode))
   {
       throw new FormatException("مقدار وارد شده برای کد ثبت نام معتبر نیست.");
   }

   var RParam = new SqlParameter("RegisterationCode", registrationCode);

   db.Database.ExecuteSqlCommand("ChkDuplicate @RegisterationCode,@Name,@DuplicateR out, @DuplicateN out", RParam, NParam, dupR, dupN);
   var dupNvalue = (Boolean)dupN.Value;
   var dupRvalue = (Boolean)dupR.Value;
            
   if(dupNvalue == false && dupRvalue == false)
   {
      return true;
   }
   return false;
}

با این روش اگر ورودی کاربر نتواند به `long` تبدیل شود، خطا مناسب نمایش داده خواهد شد. این کار به شما کمک می کند تا مطمین شوید که مقادیر ورودی همیشه قابل استفاده هستند و از بروز خطا در زمان اجرای کد جلوگیری می شود.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 02:29 1401/05/04

خطای شما Can't convert nvarchar to bigint هست. یعنی یکی از پارامترهاتون از نوع long یا bigint هست در دیتابیس، ولی دارید بهش یک رشته ارسال می کنید. باید تک تک پارامترها و DataType اونها رو چک کنید و مقادیری هم که بهش ارسال می کنید چک کنید که اشتباه ارسال نشه.

ویرایش شده در سه شنبه 4 مرداد 1401 ساعت 02:29:41
به این پاسخ امتیاز بدهید    0
امتیاز: 1635 رتبه: 2
پاسخ دهنده : mmr1401 11:33 1401/05/05

سلام

با این که همه چیز به ظاهر درست بود یعنی تبدیل nvarchar  به bigint درست انجام میشد (با قرار دادن breakponit  و اجرای خط به خط و مشاهده مقادیر اختصاص داده شده به هر متغییر) در هر صورت

این مشکل رو با تغییر خط

db.Database.ExecuteSqlCommand("ChkDuplicate @RegisterationCode,@Name,@DuplicateR out, @DuplicateN out", RParam, NParam, dupR, dupN);

 به شکل زیر حل کردم.

db.Database.ExecuteSqlCommand("ChkDuplicate @Name,@RegisterationCode,@DuplicateR out, @DuplicateN out",NParam, RParam,  dupR, dupN);

 

 

حالا نمیدونم چرا ولی با تغییر جایگاه دو متغییر ارسالی به sp مشکل حل شد. (پس و پیش کردن ارسال دو متغییر)

به این پاسخ امتیاز بدهید    0
امتیاز: 45 رتبه: 19
2 نظر
fateme : شما باید پارامترها رو دقیقا به ترتیبی که در SP در Sql Server قرار دادید ارسال کنید. اینجوری ممکنه یه پارامتر varchar رو به جای int ارسال کنید.

امتیاز کاربر : 1635   رتبه کاربر : 2   تاریخ ثبت : 11:57 1401/05/05
mmr1401 : سلام اگر به ترتیب باشه که همون نگارش اول درست بود!! نه اون دومی که!! (هر چند ساختار SPجوری نبود که عملیات خاصی انجام بده که ترتیب ورودی ها مهم باشه)واقعا نمیفهمم از چی بود مشکل.

امتیاز کاربر : 45   رتبه کاربر : 19   تاریخ ثبت : 12:11 1401/05/05
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود