codeSeven
codeSeven

Reputation: 469

Implicit conversion from data type nvarchar to varbinary(max) is not allowed , uploading a file

I get this error when uploading a file, even though my column data type in SQL is already a varbinary. I don't know why my parameter @FileUpload saying is a nvarchar. By the I'm using datatable function so it could easily stored in whole and send to database, I'm also using UserDefinedTableType for that and my datatype is already a varbinary.

  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(string));

        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" });
    }

Upvotes: 1

Views: 693

Answers (1)

Zohar Peled
Zohar Peled

Reputation: 82504

The type of the "Data" column in your data table shouldn't be string, it should be byte[] - Change this:

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

To this:

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

Upvotes: 2

Related Questions