点击替换按钮后InsertStudentData无法插入Excel学生数据问题
问题描述
服务器端有一个Index Action方法,负责将Excel数据插入数据库的Student表,逻辑如下:
- 若同名文件已存在,则不上传该Excel文件
- 若不存在,则上传文件名至
Excel历史记录表,并导入Excel中的学生数据
当检测到同名文件(count>0)时会弹出覆盖模态框,但点击替换按钮后,调用InsertStudentData方法却没有数据插入。
服务器端Action代码
// GET: Student public ActionResult Index() { var studentList = _studentDAL.GetallStudents(); if (studentList.Count == 0) { TempData["InfoMessage"] = "Student data unavailable in the Database."; } return View(studentList); } [HttpPost] public ActionResult Index(HttpPostedFileBase file) { if (file != null && file.ContentLength > 0) { // 获取文件名 var fileName = Path.GetFileName(file.FileName); // 将文件名存入TempData TempData["FileName"] = fileName; // 检查数据库中是否已存在同名文件 using (var cmd = new SqlCommand("SELECT COUNT(*) FROM Excel WHERE FileName = @FileName", con)) { cmd.Parameters.AddWithValue("@FileName", fileName); con.Open(); int count = (int)cmd.ExecuteScalar(); con.Close(); // 如果count>0,说明同名文件已存在 if (count > 0) { ViewBag.FileExists = true; ViewBag.Message = "A file with this name already exists in the database."; return View(); } } // 如果count=0,保存文件并将文件名插入数据库 string filename = Guid.NewGuid() + Path.GetExtension(file.FileName); string filepath = "/excelfolder/" + filename; TempData["FilePath"] = filepath; file.SaveAs(Path.Combine(Server.MapPath("/excelfolder"), filename)); InsertStudentdata(filepath, filename); using (var cmd = new SqlCommand("INSERT INTO Excel (FileName) VALUES (@FileName)", con)) { cmd.Parameters.AddWithValue("@FileName", fileName); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } int fileID = 0; using (var cmd = new SqlCommand("SELECT MAX(ID) FROM Excel", con)) { con.Open(); object result = cmd.ExecuteScalar(); if (result != DBNull.Value) { fileID = Convert.ToInt32(result); } con.Close(); } using (var cmd = new SqlCommand("UPDATE Student SET FileID = @fileID WHERE ImportDate = (SELECT MAX(ImportDate) FROM Student)", con)) { cmd.Parameters.AddWithValue("@FileID", fileID); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } } var studentList = _studentDAL.GetallStudents(); if (studentList.Count == 0) { TempData["InfoMessage"] = "Student data unavailable in the Database."; } using (SqlConnection connection = new SqlConnection(conString)) { connection.Open(); using (SqlCommand command2 = new SqlCommand("UpdateMclStat", connection)) { command2.CommandType = CommandType.StoredProcedure; command2.ExecuteNonQuery(); } } return View(studentList); } [HttpPost] public ActionResult Overwrite() { // 从TempData中获取文件名 var fileName = TempData["FileName"] as string; var filepath = TempData["FilePath"] as string; // 获取同名Excel文件的ID int fileId = 0; using (var cmd = new SqlCommand("SELECT TOP 1 ID FROM Excel WHERE FileName = @FileName ORDER BY ID DESC", con)) { cmd.Parameters.AddWithValue("@FileName", fileName); con.Open(); object result = cmd.ExecuteScalar(); if (result != DBNull.Value) { fileId = Convert.ToInt32(result); } con.Close(); } // 删除Student表中对应FileID的所有记录 using (var cmd = new SqlCommand("DELETE FROM Student WHERE FileID = @FileID", con)) { cmd.Parameters.AddWithValue("@FileID", fileId); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } return Json(new { success = true }); }
接收Excel文件的初始模态框代码
<form method="post" enctype="multipart/form-data"> <div style="margin-bottom:20px;"> <div style="display: flex; justify-content: flex-end;"> <input name="file" type="file" required style="background-color: lightgray; margin-right: 10px;" /> <button id="importBtn" type="button" class="btn btn-primary" style="height: 34px; line-height: 34px;">Import</button> </div> <div id="confirmationModal" class="modal"> <div class="modal-content "> <p>Are you sure you want to import?</p> <div class="modal-footer"> <button id="yesBtn" type="submit" class="btn btn-primary">Yes</button> <button id="noBtn" type="button" class="btn btn-secondary">No</button> </div> </div> </div> </div> </form> <script src="~/Scripts/CustomJS/ModalImport.js"></script>
显示替换按钮的覆盖模态框代码
<form id="myForm" method="post" action="@Url.Action("Index", "Student")"> <!-- 隐藏输入框存储文件名 --> <input type="hidden" name="filename" value="@ViewBag.FileName" /> @if (ViewBag.FileExists == true) { <!-- 文件已存在模态框 --> <div class="modal" id="file-exists-modal" tabindex="-1" role="dialog" style="display: block; background: rgba(0,0,0,0.5);"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Overwrite</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p>A file with the same name already exists.</p> </div> <div class="modal-footer"> <!-- 点击替换按钮时,给action参数赋值"replace" --> <button id="replaceButton" type="submit" name="action" value="replace">Replace</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> </div> </div> </div> </div> } </form> <script> $('#replaceButton').click(function (event) { event.preventDefault(); // 阻止默认表单提交行为 $.ajax({ type: 'POST', url: '/Student/OverWrite', success: function (data) { // 刷新页面更新表格 location.reload(); }, error: function () { alert('An error occurred while deleting the data.'); } }); }); </script>
Excel数据插入方法代码
private void InsertStudentdata(string fileepath, 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.Student"; objbulk.ColumnMappings.Add("StudentID", "StudentID"); objbulk.ColumnMappings.Add("FirstName", "FirstName"); objbulk.ColumnMappings.Add("LastName", "LastName"); objbulk.ColumnMappings.Add("College", "College"); objbulk.ColumnMappings.Add("Program", "Program"); objbulk.ColumnMappings.Add("YearGraduate", "YearGraduate"); objbulk.ColumnMappings.Add("DateExam", "DateExam"); objbulk.ColumnMappings.Add("TakeNumber", "TakeNumber"); objbulk.ColumnMappings.Add("BoardScore", "BoardScore"); objbulk.ColumnMappings.Add("FileID", "FileID"); objbulk.ColumnMappings.Add("ImportDate", "ImportDate"); con.Open(); objbulk.WriteToServer(dt); con.Close(); }
问题分析与修复方案
核心问题
- 替换流程缺失文件导入逻辑:当前
OverwriteAction只删除了旧数据,没有重新处理用户上传的Excel文件,也没调用InsertStudentdata导入新数据。 - TempData无法保留文件内容:
TempData中的文件路径和内容在页面返回后会失效,替换时没有可处理的文件。 - 模态框表单未携带文件数据:覆盖模态框的表单没有文件上传控件,无法提交新的Excel文件。
修复步骤
1. 修改覆盖模态框,添加文件上传控件
让用户在替换时可以重新选择文件:
@if (ViewBag.FileExists == true) { <div class="modal" id="file-exists-modal" tabindex="-1" role="dialog" style="display: block; background: rgba(0,0,0,0.5);"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">替换文件</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p>同名文件已存在,请选择要替换的新文件:</p> <input name="file" type="file" required style="background-color: lightgray; margin-top:10px;" /> </div> <div class="modal-footer"> <button id="replaceButton" type="submit" name="action" value="replace">替换并导入</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> </div> </div> </div> </div> }
2. 整合替换逻辑到Index POST方法
修改Index的POST方法,通过action参数区分新增/替换操作:
[HttpPost] public ActionResult Index(HttpPostedFileBase file, string action) { if (file != null && file.ContentLength > 0) { var fileName = Path.GetFileName(file.FileName); TempData["FileName"] = fileName; // 处理替换逻辑 if (action == "replace") { // 获取旧文件ID并删除关联数据 int oldFileId = 0; using (var cmd = new SqlCommand("SELECT TOP 1 ID FROM Excel WHERE FileName = @FileName ORDER BY ID DESC", con)) { cmd.Parameters.AddWithValue("@FileName", fileName); con.Open(); object result = cmd.ExecuteScalar(); if (result != DBNull.Value) oldFileId = Convert.ToInt32(result); con.Close(); } // 删除旧学生数据和Excel记录 using (var cmd = new SqlCommand("DELETE FROM Student WHERE FileID = @FileID", con)) { cmd.Parameters.AddWithValue("@FileID", oldFileId); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } using (var cmd = new SqlCommand("DELETE FROM Excel WHERE ID = @FileID", con)) { cmd.Parameters.AddWithValue("@FileID", oldFileId); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } // 重新保存新文件并导入数据 string newFileName = Guid.NewGuid() + Path.GetExtension(file.FileName); string filePath = "/excelfolder/" + newFileName; file.SaveAs(Path.Combine(Server.MapPath("/excelfolder"), newFileName)); InsertStudentdata(filePath, newFileName); // 插入新Excel记录并更新FileID using (var cmd = new SqlCommand("INSERT INTO Excel (FileName) VALUES (@FileName)", con)) { cmd.Parameters.AddWithValue("@FileName", fileName); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } int newFileId = 0; using (var cmd = new SqlCommand("SELECT MAX(ID) FROM Excel", con)) { con.Open(); object result = cmd.ExecuteScalar(); if (result != DBNull.Value) newFileId = Convert.ToInt32(result); con.Close(); } using (var cmd = new SqlCommand("UPDATE Student SET FileID = @fileID WHERE ImportDate = (SELECT MAX(ImportDate) FROM Student)", con)) { cmd.Parameters.AddWithValue("@FileID", newFileId); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } } else { // 原有的新增逻辑(保持不变) using (var cmd = new SqlCommand("SELECT COUNT(*) FROM Excel WHERE FileName = @FileName", con)) { cmd.Parameters.AddWithValue("@FileName", fileName); con.Open(); int count = (int)cmd.ExecuteScalar(); con.Close(); if (count > 0) { ViewBag.FileExists = true; ViewBag.Message = "同名文件已存在于数据库中。"; return View(_studentDAL.GetallStudents()); } } string filename = Guid.NewGuid() + Path.GetExtension(file.FileName); string filepath = "/excelfolder/" + filename; file.SaveAs(Path.Combine(Server.MapPath("/excelfolder"), filename)); InsertStudentdata(filepath, filename); using (var cmd = new SqlCommand("INSERT INTO Excel (FileName) VALUES (@FileName)", con)) { cmd.Parameters.AddWithValue("@FileName", fileName); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } int fileID = 0; using (var cmd = new SqlCommand("SELECT MAX(ID) FROM Excel", con)) { con.Open(); object result = cmd.ExecuteScalar(); if (result != DBNull.Value) fileID = Convert.ToInt32(result); con.Close(); } using (var cmd = new SqlCommand("UPDATE Student SET FileID = @fileID WHERE ImportDate = (SELECT MAX(ImportDate) FROM Student)", con)) { cmd.Parameters.AddWithValue("@FileID", fileID); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } } } var studentList = _studentDAL.GetallStudents(); if (studentList.Count == 0) { TempData["InfoMessage"] = "数据库中无学生数据。"; } using (SqlConnection connection = new SqlConnection(conString)) { connection.Open(); using (SqlCommand command2 = new SqlCommand("UpdateMclStat", connection)) { command2.CommandType = CommandType.StoredProcedure; command2.ExecuteNonQuery(); } } return View(studentList); }
3. 删除冗余的Overwrite Action并修改JS
删除原Overwrite Action,修改模态框JS直接提交表单:
<script> $('#replaceButton').click(function (event) { $('#myForm').submit(); }); </script>
4. 优化InsertStudentdata方法(可选)
确保数据读取和BulkCopy逻辑稳定:
private void InsertStudentdata(string filename) { string fullpath = Server.MapPath("/excelfolder/") + filename; using (OleDbConnection econ = ExcelConn(fullpath)) { string query = "Select * from [Sheet1$]"; using (OleDbDataAdapter oda = new OleDbDataAdapter(query, econ)) { DataSet ds = new DataSet(); oda.Fill(ds); if (ds.Tables.Count == 0) return; DataTable dt = ds.Tables[0]; // 确保目标列存在 if (!dt.Columns.Contains("FileID")) dt.Columns.Add("FileID",
相关产品推荐
相关产品推荐

