2017-01-23 5 views
0

Ich schrieb eine einfache Anwendung zum Hochladen von Excel-Daten auf SQL. Ich verwende ADO.NET und OLEDB. Also habe ich bisher eine Tabelle auf dem SQL-Server, die nur zwei Felder enthält: ProbeID (die automatisch generiert wird) und ProbeName (das ich aus meiner xls-Datei abrufe). Meine Excel-Datei enthält eine Reihe von Spalten, aber ich brauche nur Probe Name. Also, wenn App die Datei liest und auf oledb speichert, scheint es, dass Name fields immer Null bleibt und wenn es in db-Tabelle eingefügt wird, fügt es die richtige Menge an Zeilen ein, aber mit dem Null-Wert von ProbeName. Ich kann nicht herausfinden, wo das Problem in meinem Code ist. Hier ist meine Upload-Methode. Was mache ich falsch?Einfügen von Excel-Daten auf SQL-Server mit ASP.NET MVC

[HttpPost] 
    public JsonResult UploadExcel(Probe probes, HttpPostedFileBase FileUpload) 
    { 

     var data = new List<string>(); 
     if (FileUpload != null) 
     { 
      // tdata.ExecuteCommand("truncate table OtherCompanyAssets"); 
      if (FileUpload.ContentType == "application/vnd.ms-excel" || FileUpload.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
      { 


       var filename = FileUpload.FileName; 
       var targetpath = Server.MapPath("~/Doc/"); 
       FileUpload.SaveAs(targetpath + filename); 
       var pathToExcelFile = targetpath + filename; 
       var connectionString = ""; 
       if (filename.EndsWith(".xls")) 
       { 
        connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", pathToExcelFile); 
       } 
       else if (filename.EndsWith(".xlsx")) 
       { 
        connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", pathToExcelFile); 
       } 

       var adapter = new OleDbDataAdapter("SELECT * FROM [report$]", connectionString); 
       var ds = new DataSet(); 

       adapter.Fill(ds, "ExcelTable"); 

       var dtable = ds.Tables["ExcelTable"]; 

       const string sheetName = "report"; 

       var excelFile = new ExcelQueryFactory(pathToExcelFile); 
       var dataInProbe = from a in excelFile.Worksheet<Probe>(sheetName) select a; 

       foreach (var a in dataInProbe) 
       { 
        try 
        { 
         if (a.ProbeName != "") 
         { 
          var pr = new Probe(); 
          pr.ProbeName = a.ProbeName; 
          db.Probes.Add(pr); 

          db.SaveChanges(); 
         } 
         else 
         { 
          data.Add("<ul>"); 
          if (string.IsNullOrEmpty(a.ProbeName)) data.Add("<li> Probe name is required</li>"); 
          data.Add("</ul>"); 
          data.ToArray(); 
          return Json(data, JsonRequestBehavior.AllowGet); 
         } 
        } 

        catch (DbEntityValidationException ex) 
        { 
         foreach (var entityValidationErrors in ex.EntityValidationErrors) 
         { 

          foreach (var validationError in entityValidationErrors.ValidationErrors) 
          { 

           Response.Write("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage); 

          } 

         } 
        } 
       } 
       //deleting excel file from folder 
       if ((System.IO.File.Exists(pathToExcelFile))) 
       { 
        System.IO.File.Delete(pathToExcelFile); 
       } 
       return Json("success", JsonRequestBehavior.AllowGet); 
      } 
      else 
      { 
       //alert message for invalid file format 
       data.Add("<ul>"); 
       data.Add("<li>Only Excel file format is allowed</li>"); 
       data.Add("</ul>"); 
       data.ToArray(); 
       return Json(data, JsonRequestBehavior.AllowGet); 
      } 
     } 
     else 
     { 
      data.Add("<ul>"); 
      if (FileUpload == null) data.Add("<li>Please choose Excel file</li>"); 
      data.Add("</ul>"); 
      data.ToArray(); 
      return Json(data, JsonRequestBehavior.AllowGet); 
     } 
    } 
+0

Sie können den Import-Export-Assistenten verwenden, um Daten von Excel nach SQL SERVER zu importieren. Überprüfen Sie diesen Link https://msdn.microsoft.com/en-us/library/ms140052.aspx –

+0

Danke, aber ich muss die ASP.NET MVC verwenden, weil ich später eine UI erstellen muss, wo Benutzer nach dem Einfügen sehen können eingefügte Daten – Vytautas

+0

Sie markierten sql - server. Also können wir es in sql auf diese Weise machen und diese Datei können wir in SQL Job einplanen. –

Antwort

0

Es dauerte einige Zeit, um es herauszufinden, aber ich habe es funktioniert, das ist nur der Versuch App für den Upload Excel-Datei auf den db, aber für die Zukunft denke ich, ist es einfacher, EF zu verwenden anstelle von Daten-Set.

[HttpPost] 
    public ActionResult UploadExcel(Probe probes, HttpPostedFileBase FileUpload) 
    { 

     var data = new List<string>(); 
     if (FileUpload != null) 
     { 
      if (FileUpload.ContentType == "application/vnd.ms-excel" || FileUpload.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
      { 
       var filename = FileUpload.FileName; 
       var targetpath = Server.MapPath("~/Doc/"); 
       FileUpload.SaveAs(targetpath + filename); 
       var pathToExcelFile = targetpath + filename; 
       string FileName = Path.GetFileName(FileUpload.FileName); 
       string Extension = Path.GetExtension(FileUpload.FileName); 
       DataTable dataFound = Import_To_Grid(pathToExcelFile, Extension, "Yes"); 
       List<ProbeData> dataProbList = new List<ProbeData>(); 
       foreach (DataRow item in dataFound.Rows) 
       { 
        try 
        { 
         var probeName = item["Probe"].ToString(); 
         var alreadyexist = db.Probes.Where(d => d.ProbeName == probeName).FirstOrDefault(); 
         var probId = 0; 
         if (alreadyexist != null) 
         { 
          probId = alreadyexist.Probe_ID; 
         } 
         else 
         { 
          Probe objProb = new Probe(); 
          objProb.ProbeName = probeName.ToString(); 
          db.Probes.Add(objProb); 
          db.SaveChanges(); 
          probId = objProb.Probe_ID; 
          ProbeData objPD = new ProbeData(); 
          objPD.ProbeId = probId; 
          objPD.ProbeName = objProb.ProbeName; 
          dataProbList.Add(objPD); 
         } 
        } 
        catch (DbEntityValidationException ex) 
        { 
         foreach (var entityValidationErrors in ex.EntityValidationErrors) 
         { 

          foreach (var validationError in entityValidationErrors.ValidationErrors) 
          { 

           Response.Write("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage); 

          } 

         } 
        } 

       } 
       //deleting excel file from folder 
       if ((System.IO.File.Exists(pathToExcelFile))) 
       { 
        System.IO.File.Delete(pathToExcelFile); 
       } 
       ViewBag.ProbeData = dataProbList; 
       //ViewBag.SCImportData = dataSCImporobList; 
       return View("Index"); 
      } 
      else 
      { 
       //alert message for invalid file format 
       data.Add("<ul>"); 
       data.Add("<li>Only Excel file format is allowed</li>"); 
       data.Add("</ul>"); 
       data.ToArray(); 
       return Json(data, JsonRequestBehavior.AllowGet); 
      } 
     } 
     else 
     { 
      data.Add("<ul>"); 
      if (FileUpload == null) data.Add("<li>Please choose Excel file</li>"); 
      data.Add("</ul>"); 
      data.ToArray(); 
      return Json(data, JsonRequestBehavior.AllowGet); 
     } 
    } 
    private DataTable Import_To_Grid(string FilePath, string Extension, string isHDR) 
    { 
     string conStr = ""; 
     switch (Extension) 
     { 
      case ".xls": //Excel 97-03 
       conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"] 
         .ConnectionString; 
       break; 
      case ".xlsx": //Excel 07 
       conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"] 
          .ConnectionString; 
       break; 
     } 
     conStr = String.Format(conStr, FilePath, isHDR); 
     OleDbConnection connExcel = new OleDbConnection(conStr); 
     OleDbCommand cmdExcel = new OleDbCommand(); 
     OleDbDataAdapter oda = new OleDbDataAdapter(); 
     DataTable dt = new DataTable(); 
     cmdExcel.Connection = connExcel; 

     //Get the name of First Sheet 
     connExcel.Open(); 
     DataTable dtExcelSchema; 
     dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString(); 
     connExcel.Close(); 

     //Read Data from First Sheet 
     connExcel.Open(); 
     cmdExcel.CommandText = "SELECT * From [" + SheetName + "]"; 
     oda.SelectCommand = cmdExcel; 
     oda.Fill(dt); 
     connExcel.Close(); 
     return dt; 

    }