当前位置:首页 > 行业动态 > 正文

C上传Excel数据如何更新数据库?

csharp,using System.Data.OleDb;,// 打开Excel文件连接,string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=path_to_excel;Extended Properties='Excel 12.0 Xml;HDR=YES'";,using (OleDbConnection conn = new OleDbConnection(connStr)),{, conn.Open();, string query = "SELECT FROM [Sheet1$]";, OleDbCommand cmd = new OleDbCommand(query, conn);, OleDbDataReader reader = cmd.ExecuteReader();, while (reader.Read()), {, // 获取Excel数据, int id = Convert.ToInt32(reader["ID"]);, string name = reader["Name"].ToString();, // 更新数据库, string updateQuery = $"UPDATE TableName SET Name = '{name}' WHERE ID = {id}";, using (SqlConnection dbConn = new SqlConnection("your_connection_string")), {, dbConn.Open();, SqlCommand dbCmd = new SqlCommand(updateQuery, dbConn);, dbCmd.ExecuteNonQuery();, }, },},

在C#中上传Excel文件并更新数据库是一个常见的需求,尤其是在处理大量数据导入和更新时,以下是实现这一功能的详细步骤:

准备工作

安装必要的NuGet包

EPPlus:用于读取和写入Excel文件。

Dapper:一个轻量级的ORM,用于执行数据库操作。

C上传Excel数据如何更新数据库?

System.Data.SqlClient:用于连接SQL Server数据库(如果使用其他数据库,请安装相应的客户端库)。

Install-Package EPPlus
Install-Package Dapper
Install-Package System.Data.SqlClient

读取Excel文件

使用EPPlus库读取Excel文件中的数据,假设Excel文件有多个工作表,每个工作表包含不同的数据类型。

using OfficeOpenXml;
using System.IO;
using System.Data;
public DataTable ReadExcelFile(string filePath, string sheetName)
{
    using (var package = new ExcelPackage(new FileInfo(filePath)))
    {
        var worksheet = package.Workbook.Worksheets[sheetName];
        var dataTable = new DataTable();
        foreach (var firstRowCell in worksheet.Cells[1, 1, 1, worksheet.Dimension.End.Column])
        {
            dataTable.Columns.Add(firstRowCell.Text);
        }
        for (int rowNumber = 2; rowNumber <= worksheet.Dimension.End.Row; rowNumber++)
        {
            var row = worksheet.Cells[rowNumber, 1, rowNumber, worksheet.Dimension.End.Column];
            var newRow = dataTable.NewRow();
            foreach (var cell in row)
            {
                newRow[cell.Start.Column 1] = cell.Text;
            }
            dataTable.Rows.Add(newRow);
        }
        return dataTable;
    }
}

更新数据库

使用Dapper库将读取到的Excel数据更新到数据库中,假设我们有一个名为Employees的表,并且Excel文件中的数据需要插入或更新该表中的数据。

C上传Excel数据如何更新数据库?

using Dapper;
using System.Data.SqlClient;
public void UpdateDatabase(DataTable dataTable, string connectionString)
{
    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        // 清空目标表(可选)
        connection.Execute("DELETE FROM Employees");
        // 批量插入数据
        foreach (DataRow row in dataTable.Rows)
        {
            var parameters = new DynamicParameters();
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                parameters.Add($"@{dataTable.Columns[i].ColumnName}", row[i]);
            }
            connection.Execute("INSERT INTO Employees (" + string.Join(", ", dataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName)) + ") VALUES (" + string.Join(", ", Enumerable.Repeat("@p{0}", dataTable.Columns.Count).Select((v, i) => v.Replace("{0}", i.ToString()))) + ")", parameters);
        }
    }
}

整合代码

将上述两部分代码整合到一个方法中,实现从Excel文件读取数据并更新数据库的功能。

public void UploadExcelAndUpdateDatabase(string excelFilePath, string sheetName, string connectionString)
{
    var dataTable = ReadExcelFile(excelFilePath, sheetName);
    UpdateDatabase(dataTable, connectionString);
}

调用示例

在主程序或其他适当位置调用上述方法。

class Program
{
    static void Main()
    {
        string excelFilePath = "path/to/your/excel/file.xlsx";
        string sheetName = "Sheet1";
        string connectionString = "your_database_connection_string";
        var app = new YourAppClass();
        app.UploadExcelAndUpdateDatabase(excelFilePath, sheetName, connectionString);
    }
}

相关问答FAQs

Q1: 如果Excel文件中的工作表名称不固定,如何动态获取所有工作表的名称?

A1: 可以使用EPPlus库的Workbook.Worksheets属性来获取所有工作表的名称,以下是一个示例代码片段:

C上传Excel数据如何更新数据库?

using OfficeOpenXml;
using System.IO;
using System.Collections.Generic;
public List<string> GetSheetNames(string filePath)
{
    using (var package = new ExcelPackage(new FileInfo(filePath)))
    {
        return package.Workbook.Worksheets.Select(ws => ws.Name).ToList();
    }
}

Q2: 如果需要更新现有记录而不是插入新记录,应该如何修改代码?

A2: 可以将插入语句改为更新语句,并根据某个唯一标识符(如ID)来匹配需要更新的记录,以下是一个示例代码片段:

using Dapper;
using System.Data.SqlClient;
public void UpdateDatabase(DataTable dataTable, string connectionString)
{
    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        foreach (DataRow row in dataTable.Rows)
        {
            var parameters = new DynamicParameters();
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                if (dataTable.Columns[i].ColumnName == "ID") // 假设ID是主键列
                {
                    parameters.Add("@ID", row["ID"], DbType.Int32);
                }
                else
                {
                    parameters.Add($"@{dataTable.Columns[i].ColumnName}", row[i]);
                }
            }
            connection.Execute("UPDATE Employees SET [Column1] = @Column1, [Column2] = @Column2 WHERE ID = @ID", parameters);
        }
    }
}