c# - 将上传控制器从支持 .xlsx 更改为 .csv
问题描述
我有一个 MVC 应用程序,它允许管理员用户将 2 个不同的 excel 文件上传到系统;然后,控制器使用 excel 数据创建数据集,然后使用 SqlBulkCopy 使用数据集填充“Schools”或“School2”数据库。
当我使用 IIS Express 在本地测试它们时,这些上传工作完美,尽管当我按下导入按钮时,部署到 AWS 弹性 beanstalk 的相同版本会引发错误。据我所知,这是因为我的 AWS RDS 需要访问 OleDB 提供商的喷气驱动程序;我不能做的事情是因为这些驱动程序不能像安装在 EC2 实例上一样安装在 AWS RDS 上。
所以我的计划是改变我的上传控制器以接受 .csv 文件而不是 excel 文件。这应该可以解决我的问题,并允许我的上传按钮在部署到 AWS 后工作。有人可以帮我/指出正确的方向,将我的控制器更改为支持 .csv 而不是 excel 吗?
上传控制器:
namespace CampBookingSys.Controllers
{
public class UploadController : Controller
{
SqlConnection con = new SqlConnection(@"Data Source=bookingdb.cwln7mwjvxdd.eu-west-1.rds.amazonaws.com,1433;Initial Catalog=modeldb;User ID=craig1990;Password=27Oct90!;Database=modeldb;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False");
OleDbConnection Econ;
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
string filename = Guid.NewGuid() + Path.GetExtension(file.FileName);
string filepath = "/excelfolder/" + filename;
file.SaveAs(Path.Combine(Server.MapPath("/excelfolder"), filename));
InsertExceldata(filepath, filename);
return View();
}
[HttpPost]
public ActionResult Index2(HttpPostedFileBase file)
{
string filename = Guid.NewGuid() + Path.GetExtension(file.FileName);
string filepath = "/excelfolder/" + filename;
file.SaveAs(Path.Combine(Server.MapPath("/excelfolder"), filename));
InsertExceldata2(filepath, filename);
return RedirectToAction("Index");
}
private void ExcelConn(string filepath)
{
string constr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""", filepath);
Econ = new OleDbConnection(constr);
}
private void InsertExceldata(string filepath, string filename)
{
string fullpath = Server.MapPath("/excelfolder/") + filename;
ExcelConn(fullpath);
string query = string.Format("Select * from [{0}]", "Sheet1$");
OleDbCommand Ecom = new OleDbCommand(query, Econ);
Econ.Open();
DataSet ds = new DataSet();
OleDbDataAdapter oda = new OleDbDataAdapter(query, Econ);
Econ.Close();
oda.Fill(ds);
DataTable dt = ds.Tables[0];
SqlBulkCopy objbulk = new SqlBulkCopy(con);
objbulk.DestinationTableName = "dbo.Schools";
objbulk.ColumnMappings.Add("AcademicYear", "AcademicYear");
objbulk.ColumnMappings.Add("RollNumber", "RollNumber");
objbulk.ColumnMappings.Add("OfficialSchoolName", "OfficialSchoolName");
objbulk.ColumnMappings.Add("Address1", "Address1");
objbulk.ColumnMappings.Add("Address2", "Address2");
objbulk.ColumnMappings.Add("Address3", "Address3");
objbulk.ColumnMappings.Add("Address4", "Address4");
objbulk.ColumnMappings.Add("County", "County");
objbulk.ColumnMappings.Add("Eircode", "Eircode");
objbulk.ColumnMappings.Add("LocalAuthority", "LocalAuthority");
objbulk.ColumnMappings.Add("X", "X");
objbulk.ColumnMappings.Add("Y", "Y");
objbulk.ColumnMappings.Add("ITMEast", "ITMEast");
objbulk.ColumnMappings.Add("ITMNorth", "ITMNorth");
objbulk.ColumnMappings.Add("Latitude", "Latitude");
objbulk.ColumnMappings.Add("Longitude", "Longitude");
con.Open();
objbulk.WriteToServer(dt);
con.Close();
}
private void InsertExceldata2(string filepath, string filename)
{
string fullpath = Server.MapPath("/excelfolder/") + filename;
ExcelConn(fullpath);
string query = string.Format("Select * from [{0}]", "Sheet1$");
OleDbCommand Ecom = new OleDbCommand(query, Econ);
Econ.Open();
DataSet ds = new DataSet();
OleDbDataAdapter oda = new OleDbDataAdapter(query, Econ);
Econ.Close();
oda.Fill(ds);
DataTable dt = ds.Tables[0];
SqlBulkCopy objbulk = new SqlBulkCopy(con);
objbulk.DestinationTableName = "dbo.School2";
objbulk.ColumnMappings.Add("RollNumber", "RollNumber");
objbulk.ColumnMappings.Add("OfficialSchoolName", "OfficialSchoolName");
objbulk.ColumnMappings.Add("Address1", "Address1");
objbulk.ColumnMappings.Add("Address2", "Address2");
objbulk.ColumnMappings.Add("Address3", "Address3");
objbulk.ColumnMappings.Add("Address4", "Address4");
objbulk.ColumnMappings.Add("County", "County");
objbulk.ColumnMappings.Add("Eircode", "Eircode");
objbulk.ColumnMappings.Add("PhoneNumber", "PhoneNumber");
objbulk.ColumnMappings.Add("Email", "Email");
objbulk.ColumnMappings.Add("PrincipalName", "PrincipalName");
objbulk.ColumnMappings.Add("DeisSchool", "DeisSchool");
objbulk.ColumnMappings.Add("SchoolGender", "SchoolGender");
objbulk.ColumnMappings.Add("PupilAttendanceType", "PupilAttendanceType");
objbulk.ColumnMappings.Add("IrishClassification", "IrishClassification");
objbulk.ColumnMappings.Add("GaeltachtArea", "GaeltachtArea");
objbulk.ColumnMappings.Add("FeePayingSchool", "FeePayingSchool");
objbulk.ColumnMappings.Add("Religion", "Religion");
objbulk.ColumnMappings.Add("OpenClosedStatus", "OpenClosedStatus");
objbulk.ColumnMappings.Add("TotalGirls", "TotalGirls");
objbulk.ColumnMappings.Add("TotalBoys", "TotalBoys");
objbulk.ColumnMappings.Add("TotalPupils", "TotalPupils");
con.Open();
objbulk.WriteToServer(dt);
con.Close();
}
}
}
解决方案
我的第一个建议是在 DBMS 中进行批量插入,而不是在代码中。通过代码执行它们只会增加额外的问题。
就解析 .xlsx 文件而言,OleDB 驱动程序可能是不必要的。使用办公格式有一些基本规则:
- 如果您可以将其限制为新的 (.xlsx),则可以使用OpenXML SDK。或者任何围绕它制作的 Wrappers。甚至只是 .ZipArchive 和 XMLReader 类。
- 如果您还需要支持旧格式 (.xls),则必须使用 (t)rusty Office COM Interop。这具有 COM 互操作的所有常见问题,并且还需要安装办公室和交互式会话
- 对于任何给定的显示技术和问题,可能有第三种选择。但这些很少,而且介于两者之间。由于我们总是依赖 Interop,因此我们从未像许多其他语言那样开发出完整的 Office 处理类。
我会将 OlebDB 归为最后一类——一种罕见且非常具体的解决方案。
它总是建议使用第一个选项。
官员 COM 互操作应该被默默地掩埋,从文件格式选项中删除旧格式。考虑到这是一个可能作为服务运行的 Web 应用程序,无论如何您都不会获得必要的交互式会话。
当然接受 .csv 也是一种选择。确实,Excel 具有完整的 .CSV 支持。
推荐阅读
- db2 - 为什么在 DB2 中运行选择查询会抛出字符串“DECFLOAT”错误?
- git - 重新定位不相关分支的一部分
- android - 如何删除对话框的白角(不是 AlertDialog 或 DialogFragment)?
- c# - How to configure cascade delete where there are cycles and multiple cascade paths
- if-statement - 谷歌表格查询+IFS功能
- javascript - Laravel 5.8:使用 ajax 自动刷新 div 变得混乱和滞后
- css - 使用stroke-dashoffset
- elasticsearch - 为什么linux进程中的xms xmlx数量与elasticsearch stats不同?
- apache-pig - 如何连接元组,哪些元组在包中
- java - 将表 wp_users(Wordpress) 转换为表用户(Java) - 安全登录