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

C#存储文件至MySQL失败求助:小TXT可行JPG报错(LONGBLOB无效)

问题根源与解决方案

核心问题

  1. 二进制文件处理错误:StreamReader是专门处理文本流的工具,用它读取.jpg这类二进制文件会导致数据损坏,而且转成字符串后再存储完全没必要——二进制数据应该直接以字节形式存入LONGBLOB字段。
  2. SQL字符串拼接的致命问题:直接把文件内容拼进SQL语句里,不仅会触发SQL注入风险,还会因为二进制转字符串后出现的特殊字符(比如单引号、不可见控制字符)破坏SQL语句结构,同时超长字符串也会触发MySQL的限制报错。

修复后的代码

public void UploadFile(int userId, Stream fileStream)
{
    // 把二进制流读取为字节数组
    byte[] fileBytes;
    using (MemoryStream ms = new MemoryStream())
    {
        fileStream.CopyTo(ms);
        fileBytes = ms.ToArray();
    }

    // 使用参数化查询,绝对不要直接拼接SQL
    string query = "INSERT INTO datein (user_id, file_content) VALUES (?, ?);";
    using (MySqlCommand commandDatabase = new MySqlCommand(query, databaseConaction))
    {
        commandDatabase.CommandTimeout = 60;
        // 添加参数,指定对应字段类型
        commandDatabase.Parameters.AddWithValue("@user_id", userId);
        // 二进制数据用MySqlDbType.Blob对应LONGBLOB字段
        commandDatabase.Parameters.Add("@file_content", MySqlDbType.Blob).Value = fileBytes;

        try
        {
            databaseConaction.Open();
            // 执行非查询操作用ExecuteNonQuery,不是ExecuteReader
            commandDatabase.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error: {e.Message}");
        }
        finally
        {
            // 确保连接关闭,用finally更可靠
            if (databaseConaction.State == ConnectionState.Open)
                databaseConaction.Close();
        }
    }
}

关键改动说明

  • 二进制数据处理:改用MemoryStream把输入流转成byte[],直接保留文件的原始二进制数据,避免StreamReader的文本解析损坏数据。
  • 参数化查询:用?作为占位符,通过Parameters传递数据,彻底解决SQL注入和字符串拼接导致的语法错误、超长问题。
  • 正确的执行方法:插入操作不需要返回结果集,用ExecuteNonQuery代替ExecuteReader更合适。
  • 连接管理:用finally块确保数据库连接一定会关闭,避免连接泄漏。

内容的提问来源于stack exchange,提问作者user20503064

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:01:36