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

如何在SQLite中存储字节数组?文件流存储问题求助

如何将byte[]类型的FileStream存储到SQLite数据库

嘿,我看到你在这里踩了个小坑——首先得纠正一下:你用Encoding.ASCII.GetBytes(this.FileStream)完全是多此一举,而且这个方法本身就不接受byte[]参数(它是用来把字符串转成byte数组的),所以报错是必然的。

其实SQLite原生支持二进制数据存储,对应的类型是BLOB,你的byte[] FileStream可以直接存,不需要任何额外转换。下面分几种常用的.NET场景给你具体实现方案:

1. 先准备SQLite表结构

首先你需要创建一个包含BLOB类型字段的表,用来存储二进制数据:

CREATE TABLE IF NOT EXISTS FileDetails (
    Id INTEGER PRIMARY KEY AUTOINCREMENT, -- 建议加自增主键方便后续查询
    FileName TEXT NOT NULL,
    FileStream BLOB NOT NULL
);

2. 原生SQLiteConnection实现(无ORM)

如果直接用System.Data.SQLite或Microsoft.Data.Sqlite的原生连接,只需要把byte[]作为参数传入即可,不需要转换:

using Microsoft.Data.Sqlite; // 或者 System.Data.SQLite

var fileEntity = new FileDetailsEntity 
{ 
    FileName = "example.pdf", 
    FileStream = /* 你的文件字节数组 */ 
};

using var connection = new SqliteConnection("Data Source=your_database.db");
connection.Open();

// 使用参数化查询避免注入,同时自动映射byte[]到BLOB
var insertCmd = connection.CreateCommand();
insertCmd.CommandText = @"
INSERT INTO FileDetails (FileName, FileStream) 
VALUES (@FileName, @FileStream)";
insertCmd.Parameters.AddWithValue("@FileName", fileEntity.FileName);
insertCmd.Parameters.AddWithValue("@FileStream", fileEntity.FileStream); // 直接传byte[]

insertCmd.ExecuteNonQuery();

3. Dapper实现(轻量级ORM)

Dapper会自动识别byte[]类型并映射到SQLite的BLOB字段,代码非常简洁:

using Dapper;
using Microsoft.Data.Sqlite;

var fileEntity = new FileDetailsEntity 
{ 
    FileName = "example.pdf", 
    FileStream = /* 你的文件字节数组 */ 
};

using var connection = new SqliteConnection("Data Source=your_database.db");
connection.Open();

var sql = @"
INSERT INTO FileDetails (FileName, FileStream) 
VALUES (@FileName, @FileStream)";

// Dapper自动处理byte[]到BLOB的映射
await connection.ExecuteAsync(sql, fileEntity);

4. Entity Framework Core实现(全功能ORM)

EF Core会自动将byte[]属性映射为SQLite的BLOB类型,你只需要配置好DbContext即可:

第一步:配置DbContext

using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public DbSet<FileDetailsEntity> FileDetails { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=your_database.db");
    }

    // 可选:显式指定字段类型(其实EF Core会自动识别,这步可省略)
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<FileDetailsEntity>()
            .Property(f => f.FileStream)
            .HasColumnType("BLOB");
    }
}

第二步:存储数据

var fileEntity = new FileDetailsEntity 
{ 
    FileName = "example.pdf", 
    FileStream = /* 你的文件字节数组 */ 
};

using var context = new AppDbContext();
context.FileDetails.Add(fileEntity);
await context.SaveChangesAsync();

关键总结

  • 不要对已有的byte[]做任何编码转换:你的FileStream已经是二进制数据,直接存储即可,之前的错误是误用了Encoding类的方法(它是用来处理字符串和字节数组之间的转换,不是处理已有的二进制数据)。
  • SQLite的BLOB类型专门用来存储二进制数据,和.NET的byte[]是完美匹配的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:36:44