وارد كردن اطلاعات از Excel به پایگاه داده با استفاده از Entity Framework در ASP.Net MVC
در مقاله نشان میدهیم كه چگونه فایل های دادهای موجود در فایل اكسل را به پایگاه داده با استفاده از Entity Framework در ASP.Net MVCRazor انتقال میدهیم.اطلاعات فایل اكسل آپلود شده با استفاده از كتابخانه OLEDB خوانده می شود و داده های خوانده شده به پایگاه داده SQL Server با استفاده از Entity Framework وارد می شوند.
پایگاه داده
ابتدا یك پایگاه داده و یك جدول با نام Costumer با فیلدهای زیر در آن ایجاد كرده:
- CustomerId از نوع int و بصورت identity
- Name از نوع Varchar كه اسامی را نگه داری میكند
- و فیلد Country كه ملیتها را را نگه داری میكند از نوع varchar
توجه : اسكریپت sql در قسمت دانلود قرر داده شده است.
فایل های اكسل نسخه 97-2003 و 2007 و بالاتر از OLEDB مختلف استفاده می كنند و از این رو دو رشته اتصال مختلف در فایل Web.Config باید ایجاد كرد.
Property DataSource یك پارامتر {0} اختصاص داده شده است كه توسط مسیر واقعی فایل جایگزین می شود.
رشته های اتصال
<connectionStrings>
<add name ="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
<add name ="Excel07ConString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
</connectionStrings>
سپس فضای نام های زیر را به پروژه اضافه كنید:
فضای نام ها
using System.IO;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
Controller
Controller متشكل از دو روش عمل است.
روش GET
در داخل این روش اطلاعات، به سادگی به View بازگردانده می شود.
POST روش عملی برای اداره عملیات برای آپلود و خواندن فایل اكسل
این روش برای آپلود كردن فایل اكسل و وارد كرده اطلات به پایگاه داده استفاده میشود.
فایل اكسل آپلود شده در پوشه ای با نام Upload ها ذخیره می شود و سپس بر اساس فرمت آن یعنی XLS (97-2003) یا XLSX (2007 و بالاتر)، رشته اتصال مناسب از فایل Web.Config خوانده می شود و مكان {0} با مسیر جایگزین میشود.
با استفاده از نام Sheet fetched، یك عبارت SELECT اجرا می شود و تمام ركوردها از صفحه اكسل به DataTable وارد می شوند.
حالا یك حلقه بر روی ردیف DataTable اجرا می شود و هر یك از ركورد ها به جدول پایگاه داده با استفاده از Entity Framework ذخیره می شود .
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(HttpPostedFileBase postedFile)
{
string filePath = string.Empty;
if (postedFile != null)
{
string path = Server.MapPath("~/Uploads/");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
filePath = path + Path.GetFileName(postedFile.FileName);
string extension = Path.GetExtension(postedFile.FileName);
postedFile.SaveAs(filePath);
string conString = string.Empty;
switch (extension)
{
case ".xls": //اكسل 97-03.
conString = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
break;
case ".xlsx": //اكسل 2007 به بالا.
conString = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
break;
}
DataTable dt = new DataTable();
conString = string.Format(conString, filePath);
using (OleDbConnection connExcel = new OleDbConnection(conString))
{
using (OleDbCommand cmdExcel = new OleDbCommand())
{
using (OleDbDataAdapter odaExcel = new OleDbDataAdapter())
{
cmdExcel.Connection = connExcel;
//گرفتن نام در سند اكسل.
connExcel.Open();
DataTable dtExcelSchema;
dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
connExcel.Close();
//خواندن اطلاعات از سند.
connExcel.Open();
cmdExcel.CommandText = "SELECT * From [" + sheetName + "]";
odaExcel.SelectCommand = cmdExcel;
odaExcel.Fill(dt);
connExcel.Close();
}
}
}
//وارد كردن اطلاعات به دیتا تیبل.
CustomersEntities entities = new CustomersEntities();
foreach (DataRow row in dt.Rows)
{
entities.Customers.Add(new Customer
{
Name = row["Name"].ToString(),
Country = row["Country"].ToString()
});
}
entities.SaveChanges();
}
return View();
}
}
View
View شامل یك عنصر HTML FileUpload و دكمه Submit است كه در یك عنصر فرم قرار دارد.
فرم HTML با استفاده از روش Html.BeginForm كه پارامترهای زیر را می پذیرد ایجاد شده است.
- ActionName نام اكشن در این مورد نام Index است.
- ControllerName نام Controller كننده در این مورد نام Home است.
- FormMethodروش فرم را یعنی GET یا POST مشخص می كند. در این مورد به POST تنظیم خواهد شد.
- HtmlAttributes این آرایه اجازه می دهد تا مشخصات مشخصی را تعیین كنیم. در اینجا ما باید enctype = "multipart / form-data" مشخص كنیم كه برای آپلود فایلها ضروری است.
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="file" name="postedFile" />
<input type="submit" value="Import" />
}
</body>
</html>