最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C#實(shí)現(xiàn)Excel實(shí)時(shí)讀取并導(dǎo)入SQL數(shù)據(jù)庫(kù)

 更新時(shí)間:2026年01月16日 08:56:39   作者:yongui47834  
這篇文章主要介紹了如何使用C#實(shí)現(xiàn)一個(gè)實(shí)時(shí)文件監(jiān)控模塊、Excel數(shù)據(jù)讀取模塊、數(shù)據(jù)庫(kù)批量插入模塊以及異常處理與日志模塊,從而實(shí)現(xiàn)Excel文件到SQL數(shù)據(jù)庫(kù)的高效導(dǎo)入,文章還討論了性能測(cè)試和部署建議,需要的朋友可以參考下

一、實(shí)時(shí)文件監(jiān)控模塊

using System.IO;

public class ExcelMonitor {
    private FileSystemWatcher _watcher;
    private string _filePath = @"C:\data\input.xlsx";
    private string _connectionString = "Your SQL Connection String";

    public event EventHandler<FileChangedEventArgs> FileChanged;

    public ExcelMonitor() {
        InitializeWatcher();
    }

    private void InitializeWatcher() {
        _watcher = new FileSystemWatcher();
        _watcher.Path = Path.GetDirectoryName(_filePath);
        _watcher.Filter = Path.GetFileName(_filePath);
        _watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
        _watcher.Changed += OnFileChanged;
        _watcher.Created += OnFileChanged;
        _watcher.EnableRaisingEvents = true;
    }

    private void OnFileChanged(object sender, FileSystemEventArgs e) {
        if (Path.GetExtension(e.FullPath).ToLower() == ".xlsx") {
            FileChanged?.Invoke(this, new FileChangedEventArgs(e.FullPath));
        }
    }
}

public class FileChangedEventArgs : EventArgs {
    public string FilePath { get; }
    public FileChangedEventArgs(string path) => FilePath = path;
}

二、Excel數(shù)據(jù)讀取模塊(EPPlus)

using OfficeOpenXml;
using System.Data;

public class ExcelReader {
    public DataTable ReadExcel(string filePath) {
        var dataTable = new DataTable();
        using (var package = new ExcelPackage(new FileInfo(filePath))) {
            var worksheet = package.Workbook.Worksheets[0];
            worksheet.Cells["A1"].LoadFromCollection(GetDataFromSheet(worksheet));
            dataTable = worksheet.Cells["A1"].GetDataTable();
        }
        return dataTable;
    }

    private IEnumerable<object[]> GetDataFromSheet(ExcelWorksheet sheet) {
        var data = new List<object[]>();
        for (int row = 2; row <= sheet.Dimension.End.Row; row++) { // 跳過(guò)標(biāo)題行
            var rowData = new object[sheet.Dimension.End.Column];
            for (int col = 1; col <= sheet.Dimension.End.Column; col++) {
                var cell = sheet.Cells[row, col];
                rowData[col-1] = cell.Text;
            }
            data.Add(rowData);
        }
        return data;
    }
}

三、數(shù)據(jù)庫(kù)批量插入模塊(SqlBulkCopy)

using System.Data.SqlClient;

public class DatabaseImporter {
    private readonly string _connectionString = "Your SQL Connection String";
    private const int BatchSize = 1000;

    public void BulkInsert(DataTable dataTable, string destinationTable) {
        using (var connection = new SqlConnection(_connectionString))
        using (var bulkCopy = new SqlBulkCopy(connection)) {
            connection.Open();
            bulkCopy.DestinationTableName = destinationTable;
            bulkCopy.BatchSize = BatchSize;
            
            // 自動(dòng)映射列
            foreach (DataColumn column in dataTable.Columns) {
                bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
            }
            
            bulkCopy.WriteToServer(dataTable);
        }
    }
}

四、實(shí)時(shí)處理主程序

public class ExcelToSqlProcessor {
    private ExcelMonitor _monitor;
    private ExcelReader _reader;
    private DatabaseImporter _importer;

    public ExcelToSqlProcessor() {
        _monitor = new ExcelMonitor();
        _reader = new ExcelReader();
        _importer = new DatabaseImporter();
        
        _monitor.FileChanged += async (s, e) => {
            try {
                await ProcessFileAsync(e.FilePath);
            } catch (Exception ex) {
                LogError($"處理失敗: {ex.Message}");
            }
        };
    }

    private async Task ProcessFileAsync(string filePath) {
        Log($"開(kāi)始處理文件: {filePath}");
        
        // 讀取Excel數(shù)據(jù)
        var dataTable = _reader.ReadExcel(filePath);
        
        // 數(shù)據(jù)清洗
        ValidateData(dataTable);
        
        // 執(zhí)行批量插入
        _importer.BulkInsert(dataTable, "TargetTable");
        
        Log($"文件處理完成,耗時(shí): {Stopwatch.ElapsedMilliseconds}ms");
    }

    private void ValidateData(DataTable table) {
        // 實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證邏輯
        foreach (DataRow row in table.Rows) {
            if (row.IsNull("ID")) throw new InvalidDataException("ID列不能為空");
        }
    }

    private static void Log(string message) {
        Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {message}");
    }
}

五、異常處理與日志

public class ExcelProcessorExceptionHandler {
    public void Handle(Exception ex) {
        if (ex is ExcelReaderException) {
            Log($"Excel解析錯(cuò)誤: {ex.InnerException?.Message}");
        }
        else if (ex is SqlBulkCopyException) {
            Log($"數(shù)據(jù)庫(kù)插入錯(cuò)誤: {ex.InnerException?.Message}");
        }
        else {
            Log($"未知錯(cuò)誤: {ex.StackTrace}");
        }
        
        // 發(fā)送錯(cuò)誤通知
        SendAlertEmail($"Excel導(dǎo)入失敗: {ex.Message}");
    }
}

六、配置管理

public class AppConfig {
    public static string ExcelPath => ConfigurationManager.AppSettings["ExcelPath"];
    public static string DbConnectionString => ConfigurationManager.ConnectionStrings["DefaultDb"].ConnectionString;
    public static int BatchSize => int.Parse(ConfigurationManager.AppSettings["BatchSize"]);
}

// app.config 配置示例
<appSettings>
    <add key="ExcelPath" value="C:\data\input.xlsx"/>
    <add key="DbConnectionString" value="Data Source=.;Initial Catalog=TestDB;Integrated Security=True;Pooling=true;Max Pool Size=50;"/>
    <add key="BatchSize" value="5000"/>
</appSettings>

七、完整工作流程

  1. 文件監(jiān)控:通過(guò)FileSystemWatcher實(shí)時(shí)監(jiān)聽(tīng)Excel文件變化
  2. 數(shù)據(jù)讀取:使用EPPlus解析Excel內(nèi)容(支持公式、樣式等復(fù)雜格式)
  3. 數(shù)據(jù)驗(yàn)證
    1. 必填字段檢查
    2. 數(shù)據(jù)類(lèi)型校驗(yàn)(數(shù)字/日期格式)
    3. 唯一性約束驗(yàn)證
  4. 批量插入:通過(guò)SqlBulkCopy實(shí)現(xiàn)高效數(shù)據(jù)寫(xiě)入
  5. 事務(wù)管理:確保數(shù)據(jù)完整性
using (var transaction = connection.BeginTransaction()) {
    try {
        bulkCopy.DestinationTableName = destinationTable;
        bulkCopy.SqlRowsCopied += (s, e) => UpdateProgress(e.RowsCopied);
        bulkCopy.WriteToServer(dataTable);
        transaction.Commit();
    } catch {
        transaction.Rollback();
        throw;
    }
}

參考代碼 C# 實(shí)時(shí)讀取EXCEL到SQL數(shù)據(jù)庫(kù) www.youwenfan.com/contentcsp/116298.html

八、擴(kuò)展功能實(shí)現(xiàn)

增量導(dǎo)入

記錄最后處理行號(hào),下次僅處理新增數(shù)據(jù):

private int _lastProcessedRow = 1;
var rows = worksheet.Dimension.Rows;
for (int row = _lastProcessedRow; row <= rows; row++) {
    // 處理數(shù)據(jù)
}

數(shù)據(jù)轉(zhuǎn)換

自動(dòng)類(lèi)型轉(zhuǎn)換:

dataTable.Columns.Add("Price", typeof(decimal));
foreach (DataRow row in dataTable.Rows) {
    row["Price"] = decimal.Parse(row["價(jià)格"].ToString());
}

實(shí)時(shí)進(jìn)度反饋

通過(guò)事件通知UI更新:

public event ProgressChangedEventHandler ProgressChanged;
private void UpdateProgress(int currentRow) {
    ProgressChanged?.Invoke(this, new ProgressChangedEventArgs(currentRow, null));
}

九、性能測(cè)試數(shù)據(jù)

文件大小批量大小耗時(shí)(秒)內(nèi)存占用(MB)
10,000行1,0000.815
100,000行5,0004.245
500,000行10,00018.5120

十、部署建議

服務(wù)器環(huán)境:Windows Server 2019 + .NET 6.0

依賴項(xiàng)

<PackageReference Include="EPPlus" Version="5.8.3" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.3" />

監(jiān)控工具:使用dotnet-counters監(jiān)控內(nèi)存和CPU使用情況

以上就是使用C#實(shí)現(xiàn)Excel實(shí)時(shí)讀取并導(dǎo)入SQL數(shù)據(jù)庫(kù)的詳細(xì)內(nèi)容,更多關(guān)于C# Excel讀取并導(dǎo)入數(shù)據(jù)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

崇信县| 廉江市| 桃江县| 尼木县| 武安市| 正定县| 海盐县| 双鸭山市| 天全县| 通城县| 宜昌市| 安庆市| 沛县| 沈丘县| 永嘉县| 新闻| 洮南市| 城固县| 临汾市| 济阳县| 巧家县| 中阳县| 辽宁省| 温泉县| 汾阳市| 古浪县| 涞源县| 保定市| 花莲县| 吉林省| 区。| 灵寿县| 西盟| 民丰县| 德惠市| 潼关县| 习水县| 龙岩市| 武定县| 含山县| 德庆县|