2016-04-01 2 views
0

モデルビューコントローラとEntity Frameworkを初めて使用しており、Webアプリケーションを設計しており、Excelからデータベースにデータをインポートする必要があります。ExcelからEntity Frameworkのデータベースにデータをインポートする

dateのようなデータフィールドをインポートする際に問題が発生しています。コントローラからいくつかの値を取得し、Excelから値を取得します。

たとえば、3つのフィールド(名前、製品、日付)がある場合、Excel(名前と製品)からインポートすると、すべての行でデフォルトで日付が使用されます。

http://mvc4beginner.com/Sample-Code/ImportExportExcelData/MVC4-Import-ExcelData-to-Database.html

これは、Excelからデータをインポートするために支援しているが、私は、日付の値をとることができ、デフォルトで値を与えることができないではありませんよ。


public ActionResult Importexcel() 
    { 


     if (Request.Files[" fileupload1"].ContentLength > 0 && !string.IsNullOrEmpty(Request.Files["fileupload1"].FileName)) 
     { 
      string extension = System.IO.Path.GetExtension(Request.Files["FileUpload1"].FileName); 
      string path1 = string.Format("{0}/{1}", Server.MapPath("~/Content/UploadedFolder"), Request.Files["FileUpload1"].FileName); 
      if (System.IO.File.Exists(path1)) 
       System.IO.File.Delete(path1); 

      Request.Files["FileUpload1"].SaveAs(path1); 
      string sqlConnectionString = @"Data Source=(LocalDb)\ProjectsV12;AttachDbFilename=|DataDirectory|\BlueWhaleDB.mdf;Initial Catalog=BlueWhaleDB;Integrated Security=True"; 


      //Create connection string to Excel work book 
      string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path1 + ";Extended Properties=Excel 12.0;Persist Security Info=False"; 
      //Create Connection to Excel work book 
      OleDbConnection excelConnection = new OleDbConnection(excelConnectionString); 
      //Create OleDbCommand to fetch data from Excel 
      OleDbCommand cmd = new OleDbCommand("Select [Id],[ClientId],[InstituteId],[AdmissionId],[PreviousAdmissionId],[DateOfAdmission],[ClassId],[Class],[SectionId],[Section],[RollNumber],[FirstName],[MiddleName],[LastName],[GenderId],[DateOfBirth],[CategoryId],[StudentTypeId],[Session],[IsDeactivated],[DeactivatedDate],[ModifiedBy],[ModifiedDate] from [Student$]", excelConnection); 

      excelConnection.Open(); 

      //OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(cmd); 
      //DataTable dReader = new DataTable(); 
      //DataSet objDataset1 = new DataSet(); 

      OleDbDataReader dReader; 

      //for (int i = 0; i < dReader.Rows.Count; i++) 
      //{ 
      // new StudentViewModel 
      // { 
      //  Id = dReader.Rows[i][1]; 

      //}; 



      //if (dReader.Rows[0][6].ToString() == DateTime.MinValue) 
      //{ 
      // dReader.Rows[i][6] = DateTime.Now; 
      //} 

      //else if (dReader.Rows[0][22].ToString() == "") 
      //{ 
      // dReader.Rows[i][22] = DateTime.Now; 
      //} 

      //else if (dReader.Rows[0][21].ToString() == "") 
      //{ 
      // dReader.Rows[i][21] = "System"; 
      //} 

      //else if (dReader.Rows[0][19].ToString() != "") 
      //{ 
      // dReader.Rows[i][19] = false; 
      //} 
      dReader = cmd.ExecuteReader(); 

      SqlBulkCopy sqlBulk = new SqlBulkCopy(sqlConnectionString); 
      //Give your Destination table name 
      sqlBulk.DestinationTableName = "Student"; 
      sqlBulk.WriteToServer(dReader); 
      excelConnection.Close(); 

      // SQL Server Connection String 


     } 

     return RedirectToAction("Student"); 
    } 

これは私がOleDbDataAdapterおよの助けを借りて、このコード

+1

Do not。 EFのようなORMはETLツールではありません。彼らはデータセットではなく個々のオブジェクトを扱います。データのインポートにはオブジェクトや動作が含まれていないため、ORMやクラスを使用する理由はありません。データをインポートするには、SSIS、bcp、BULK INSERTなどのETLツールを使用します。 C#の使用を主張する場合は、SqlBulkCopyを使用してバッチを使用してデータを一括して送信し、データベースに最小限のログを記録します。速度の差は数桁で、データセットのサイズが大きくなるにつれて増加する –

+0

PS重複した質問があり、「ORMを使用しない」とは常にアンサーです。 –

+0

私はSqlBulkCopyを使用しています。私はデータをインポートすることができると述べたが、私はいくつかのデフォルト値を与える代わりに、すべてのExcelからインポートする例として私はそれが名前と製品をインポートすることを奨励し、それはdatetime.nowとして日付がかかります。 –

答えて

1

に応じて私を提案してください使用していたコードです。

以下はサンプルコードです。

Query = "Select [id],[Name],[Marks],[Grade] from [Sheet1$]"; 
//Create OleDbCommand to fetch data from Excel 
OleDbCommand cmd = new OleDbCommand(Query, excelCon); 
//System.Data.OleDb.OleDbDataReader dReader;    
DataSet ds = new DataSet(); 
OleDbDataAdapter oda = new OleDbDataAdapter(Query, excelCon); 
excelCon.Close(); 
oda.Fill(ds); 
DataTable Exceldt = ds.Tables[0]; 

foreach (DataRow dr in Exceldt.Rows) 
{ 
    ExampleModel NewModel= new ExampleModel(); 
    //Pass values to model whatever your model is. 
    //Add to your dbContext 
    dbContext.tableName.Add(NewModel); 
    dbContext.SaveChanges(); 
} 
return RedirectToAction("Import"); 
+0

このコードを試してみてください。 –

+0

@AmanGoelよろしくお願いします.DateTime null値をDateTime.UtcNow –

関連する問題