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

使用C#向MySQL写入大文件的内存溢出问题求助

如何在C#中高效将大文件完整写入MySQL数据库

问题背景

需要将大文件完整写入MySQL数据库的单条记录中,当前分块写入会生成多条记录,而将缓冲区设置为文件大小会触发System out of Memory内存溢出异常导致程序崩溃。

解决方案:使用MySQL流式参数写入

核心思路是利用MySQL Connector/NET的流式支持,直接将文件流绑定到数据库参数,无需将整个文件加载到内存,既保证单条记录存储完整文件,又严格控制内存占用。

1. 调整文件选择与数据库调用逻辑

移除原代码中分块写入数据库的循环逻辑,改为直接调用流式写入方法:

OpenFileDialog fileDialog = new OpenFileDialog();
string source = null;

if (fileDialog.ShowDialog() == DialogResult.OK)
{
    source = fileDialog.FileName;
}
else
{
    MessageBox.Show("请先选择要保存的文件");
    return;
}

string fileName = Path.GetFileName(source);
InsertLargeFileIntoDatabase(connectionString, fileName, source);

MessageBox.Show("文件已成功写入数据库!");

2. 实现流式写入数据库的方法

重构原数据库写入方法,通过文件流直接传递数据:

void InsertLargeFileIntoDatabase(string connectionString, string fileName, string filePath)
{
    using (var connection = new MySqlConnection(connectionString))
    {
        try
        {
            connection.Open();

            using (var command = new MySqlCommand(
                "INSERT INTO files_table (file_name, file_content) VALUES (@name, @content)", 
                connection))
            {
                // 添加文件名参数
                command.Parameters.AddWithValue("@name", fileName);
                
                // 打开文件流并绑定到Blob参数
                using (var fileStream = File.OpenRead(filePath))
                {
                    var contentParam = command.Parameters.Add("@content", MySqlDbType.Blob);
                    contentParam.Value = fileStream;
                    
                    // 驱动自动处理流式传输,无需手动分块
                    command.ExecuteNonQuery();
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("写入失败:" + ex.Message);
        }
        // using块自动释放连接,无需手动Close/Dispose
    }
}

关键细节说明

  • 内存控制:文件流由MySQL驱动直接读取传输,内存仅保留驱动内部的小缓冲区(通常几十KB),不会加载整个大文件。
  • 单条记录存储:整个文件会被写入到files_table的单条记录中,满足完整写入的需求。
  • 资源安全:所有流和数据库连接都用using块包裹,确保资源自动释放,避免内存泄漏。

额外注意事项

  • 确保数据库表中file_content字段类型为LONGBLOB,该类型最大支持4GB文件存储。
  • 如需监控写入进度,可以自定义包装流统计读取字节数,无需手动拆分文件。

内容的提问来源于stack exchange,提问作者Alex de Matos Caceres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:23:24