دسته بندی ها
16:27 1398/08/05

دلیل خطای Implicit conversion from data type nvarchar to varbinary(max) is not allowed

مشخصات سوال کننده :
کاربر : hamid_b     امتیاز کاربر : 518     رتبه کاربر : 4
دسته بندی : سی شارپ Asp.net Mvc

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

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

خطای "Implicit conversion from data type nvarchar to varbinary(max) is not allowed" معمولاً به این دلیل رخ می دهد که شما در حال ارسال داده هایی هستید که نوع آن ها با نوع ستونی که در پایگاه داده تعریف شده است، مطابقت ندارد.

در کدی که شما ارایه داده اید، شما یک DataTable به نام dtItems ایجاد کرده اید که دارای ستونی با نام "Data" از نوع string است، در حالی که در پایگاه داده، نوع آن باید varbinary(max) باشد.

برای رفع این مشکل، باید نوع ستون "Data" را به byte[] تغییر دهید. به این صورت:

DataTable dtItems = new DataTable();
dtItems.Columns.Add("FileName", typeof(string));
dtItems.Columns.Add("ContentType", typeof(string));
dtItems.Columns.Add("Data", typeof(byte[])); // تغییر نوع به byte[]

سپس در خطی که به DataTable ردیف اضافه می کنید، نیازی به تبدیل داده به string نیست:

dtItems.Rows.Add(file.FileName, file.ContentType, bytes); // bytes به درستی ارسال می شود

این تغییرات باید مشکل شما را برطرف کند. بعد از اصلاحات، کد شما به شکل زیر خواهد بود:

public ActionResult UpdateClearanceItems(string TranNo, string CompanyID, string AtmCard, string FleetCard, string HmoCard,
          string  Uniform, string RSA, string EducationBenefitsRSA, string AmaBankLoan, string UsedSL,
          string ProratedSL, string KingsTreat, string LastPayroll, string OthersHr, string remarksCompanyID, 
          string remarksAtmCard, string remarksFleetCard, string remarksHmoCard, string remarksUniform, 
          string remarksRSA, string remarksEducationBenefitsRSA , string remarksAmaBankLoan, string remarksUsedSL, 
          string remarksProratedSL, string remarksKingsTreat, string remarksLastPayroll, string remarksOthersHr,
          HttpPostedFileBase[] FileUpload)
{
    dynamic user = Session["UserProfile"];
    string UserID = user[0].UserID.ToString();

    DataTable dtItems = new DataTable();
    dtItems.Columns.Add("FileName", typeof(string));
    dtItems.Columns.Add("ContentType", typeof(string));
    dtItems.Columns.Add("Data", typeof(byte[])); // تغییر نوع به byte[]


    foreach (var file in FileUpload)
    {
        byte[] bytes;
        using (BinaryReader br = new BinaryReader(file.InputStream))
        {
            bytes = br.ReadBytes(file.ContentLength);
        }

        dtItems.Rows.Add(file.FileName, file.ContentType, bytes);
    }


    using (SqlConnection con = new SqlConnection(GlobalFunction.GetConnection("PayrollConnect")))
    {
        con.Open();
        try
        {
            SqlCommand cmd = new SqlCommand("spm_EmpClearancePending", con);
            cmd.CommandTimeout = 1000000;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@TranNo", TranNo.ToString());
            cmd.Parameters.AddWithValue("@UserID", UserID.ToString());
            cmd.Parameters.AddWithValue("@CompanyID", CompanyID.ToString());
            cmd.Parameters.AddWithValue("@AtmCard", AtmCard.ToString());
            cmd.Parameters.AddWithValue("@FleetCard", FleetCard.ToString());
            cmd.Parameters.AddWithValue("@HmoCard", HmoCard.ToString());
            cmd.Parameters.AddWithValue("@Uniform", Uniform.ToString());
            cmd.Parameters.AddWithValue("@RSA", RSA.ToString());
            cmd.Parameters.AddWithValue("@EducationBenefitsRSA", EducationBenefitsRSA.ToString());
            cmd.Parameters.AddWithValue("@AmaBankLoan", AmaBankLoan.ToString());
            cmd.Parameters.AddWithValue("@UsedSL", UsedSL.ToString());
            cmd.Parameters.AddWithValue("@ProratedSL", ProratedSL.ToString());
            cmd.Parameters.AddWithValue("@KingsTreat", KingsTreat.ToString());
            cmd.Parameters.AddWithValue("@LastPayroll", LastPayroll.ToString());
            cmd.Parameters.AddWithValue("@OthersHr", OthersHr.ToString());
            cmd.Parameters.AddWithValue("@remarksCompanyID", remarksCompanyID.ToString());
            cmd.Parameters.AddWithValue("@remarksAtmCard", remarksAtmCard.ToString());
            cmd.Parameters.AddWithValue("@remarksFleetCard", remarksFleetCard.ToString());
            cmd.Parameters.AddWithValue("@remarksHmoCard", remarksHmoCard.ToString());
            cmd.Parameters.AddWithValue("@remarksUniform", remarksUniform.ToString());
            cmd.Parameters.AddWithValue("@remarksRSA", remarksRSA.ToString());
            cmd.Parameters.AddWithValue("@remarksEducationBenefitsRSA", remarksEducationBenefitsRSA.ToString());
            cmd.Parameters.AddWithValue("@remarksAmaBankLoan", remarksAmaBankLoan.ToString());
            cmd.Parameters.AddWithValue("@remarksUsedSL", remarksUsedSL.ToString());
            cmd.Parameters.AddWithValue("@remarksProratedSL", remarksProratedSL.ToString());
            cmd.Parameters.AddWithValue("@remarksKingsTreat", remarksKingsTreat.ToString());
            cmd.Parameters.AddWithValue("@remarksLastPayroll", remarksLastPayroll.ToString());
            cmd.Parameters.AddWithValue("@remarksOthersHr", remarksOthersHr.ToString());

            cmd.Parameters.AddWithValue("@FileUpload", dtItems);

            cmd.ExecuteNonQuery();
        }
        catch(Exception err)
        { }
    }

    return RedirectToAction("ClearanceDashboard", "Clearance", new { Message = "Done" });
}
به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : saedbfd 16:38 1398/08/05

به خط زیر در کدهای خودتون دقت کنید

 

dtItems.Columns.Add("Data", typeof(string));

شما توی دیتابیس خودتون فیلدی رو که برای آپلود فایل و اطلاعات در نظر گرفتید از نوع Varbinary در نظر گرفتید اما توی این کدها از نوع string

کد خودتون رو به کد زیر تغییر بدید درست میشه

dtItems.Columns.Add("Data", typeof(byte[]));

 

 

به این پاسخ امتیاز بدهید    0
امتیاز: 1664 رتبه: 1
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود