You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:55:34