WPF上传Excel至SQL Server异常:空表生成+重复上传报错
Excel导入SQL Server表创建成功但无数据问题
我开发的带GUI的WPF应用支持用户上传Excel文件,预期每个文件对应SQL Server中的一张独立表,表结构与Excel列匹配。但实际运行出现异常:调试时提示文件已上传成功,查询数据库却发现对应表已创建,但无任何数据。
已尝试的解决方向:
- 将导入逻辑拆分到独立类中
- 为数据库列指定与Excel对应的精确数据类型
- 使用OfficeOpenXml读取Excel内容,System.Data.SqlClient执行数据库操作
相关代码片段
调用导入方法的代码:
// 备份Excel数据到数据库 string fileName = System.IO.Path.GetFileNameWithoutExtension(files[i]); // 获取无扩展名的文件名 string tableName = fileName; // 用文件名作为表名 string connectionString = "Connection string"; // 实际代码中已替换为有效连接字符串 BackupExcelDataToDatabase(files[i], tableName, connectionString);
核心导入方法实现:
private void BackupExcelDataToDatabase(string excelFilePath, string tableName, string connectionString) { // 读取Excel文件 using (ExcelPackage package = new ExcelPackage(new FileInfo(excelFilePath))) { ExcelWorksheet worksheet = package.Workbook.Worksheets[1]; // 假设数据在第一个工作表 // 创建DataTable存储Excel数据 DataTable dataTable = new DataTable(); // 根据定义添加列名和类型 dataTable.Columns.Add("Column1", typeof(string)); // Varchar(50) dataTable.Columns.Add("Column2", typeof(int)); // Integer dataTable.Columns.Add("Column3", typeof(string)); // Varchar(50) dataTable.Columns.Add("Column4", typeof(int)); // Integer dataTable.Columns.Add("Column5", typeof(DateTime)); // Date dataTable.Columns.Add("Column6", typeof(decimal)); // Decimal dataTable.Columns.Add("Column7", typeof(decimal)); // Decimal dataTable.Columns.Add("Column8", typeof(decimal)); // Decimal dataTable.Columns.Add("Column9", typeof(decimal)); // Decimal dataTable.Columns.Add("Column10", typeof(decimal)); // Decimal dataTable.Columns.Add("Column11", typeof(decimal)); // Decimal dataTable.Columns.Add("Column12", typeof(decimal)); // Decimal dataTable.Columns.Add("Column13", typeof(string)); // Varchar(100) dataTable.Columns.Add("Column14", typeof(int)); // Integer dataTable.Columns.Add("Column15", typeof(string)); // Varchar(50) dataTable.Columns.Add("Column16", typeof(string)); // Varchar(50) dataTable.Columns.Add("Column17", typeof(string)); // Varchar(50) dataTable.Columns.Add("Column18", typeof(string)); // Varchar(50) dataTable.Columns.Add("Column19", typeof(string)); // Varchar(50) dataTable.Columns.Add("Column20", typeof(string)); // Varchar(50) // 读取Excel数据并填充DataTable for (int row = 2; row <= worksheet.Dimension.Rows; row++) // 假设第一行是列头 { DataRow dataRow = dataTable.NewRow(); for (int col = 1; col <= worksheet.Dimension.Columns; col++) { string columnName = $"Column{col}"; object cellValue = worksheet.Cells[row, col].Value; if (cellValue != null) { dataRow[columnName] = cellValue.ToString(); } } dataTable.Rows.Add(dataRow); } // 将DataTable数据插入SQL Server数据库 using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // 创建指定名称的表 using (SqlCommand createCommand = new SqlCommand($"CREATE TABLE [{tableName}] ({GetTableColumnsDefinition(dataTable)})", connection)) { createCommand.ExecuteNonQuery(); } // 使用SqlBulkCopy批量插入数据 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { bulkCopy.DestinationTableName = tableName; bulkCopy.WriteToServer(dataTable); } } } } private string GetTableColumnsDefinition(DataTable dataTable) { StringBuilder sb = new StringBuilder(); foreach (DataColumn column in dataTable.Columns) { string columnName = column.ColumnName; string dataType; // 根据列的CLR类型匹配SQL数据类型 if (column.DataType == typeof(string)) { dataType = "VARCHAR(50)"; } else if (column.DataType == typeof(int)) { dataType = "INT"; } else if (column.DataType == typeof(DateTime)) { dataType = "DATE"; } else if (column.DataType == typeof(decimal)) { dataType = "DECIMAL(18,2)"; // 按需调整精度和小数位数 } else { dataType = "NVARCHAR(MAX)"; } sb.Append($"{columnName} {dataType},"); } // 移除末尾的逗号 if (sb.Length > 0) { sb.Length--; } return sb.ToString(); }
内容的提问来源于stack exchange,提问作者appdevlaur
相关产品推荐
相关产品推荐

