如何在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
相关产品推荐
相关产品推荐

