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

C# SQLite从旧库向结构不同新库导入BLOB问题

解决旧SQLite数据库BLOB数据导入新库的问题

嘿,我看你现在在把旧SQLite数据库里的CHART_DATA表BLOB数据,导入到结构不同的新数据库时卡壳了——已经用hex()把BLOB转成十六进制字符串读出来,但不知道怎么转回去插入新库对吧?我给你梳理下具体的解决思路和代码:

1. 先把十六进制字符串转回字节数组

你从旧库读到的01000000630AC2BF332934BF79E08D43EFF13645这种十六进制字符串,必须先转成byte[]才能作为BLOB插入新库。我写个实用的工具方法:

public static byte[] HexStringToByteArray(string hex)
{
    // 处理可能的奇数长度字符串(比如最后多一位),补个前导0避免转换出错
    if (hex.Length % 2 != 0)
    {
        hex = "0" + hex;
    }
    byte[] bytes = new byte[hex.Length / 2];
    for (int i = 0; i < hex.Length; i += 2)
    {
        bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
    }
    return bytes;
}

2. 适配新库结构完成插入

不管新库的表名、字段名怎么变,核心就是把转换后的字节数组插入到对应的二进制字段里。假设新库的目标表是NEW_CHART_TABLE,存储二进制的字段是NEW_CHART_DATA,你可以在旧库的读取循环里直接处理插入:

// 先确保你已经初始化了新数据库的连接new_dbConnection
using (SQLiteCommand insertCmd = new SQLiteCommand(
    "INSERT INTO NEW_CHART_TABLE (NEW_CHART_DATA, 其他需要的字段) VALUES (@chartData, @otherParam)", 
    new_dbConnection))
{
    new_dbConnection.Open();
    
    // 继续你之前的旧库读取循环
    while (reader.Read())
    {
        string hexChartData = reader.GetString(0);
        byte[] chartBytes = HexStringToByteArray(hexChartData);
        
        // 清空参数再赋值,避免循环里参数重复
        insertCmd.Parameters.Clear();
        insertCmd.Parameters.AddWithValue("@chartData", chartBytes);
        // 如果新库还有其他需要填充的字段,这里补充对应的参数
        // 比如 insertCmd.Parameters.AddWithValue("@otherParam", 你要传入的值);
        
        // 执行插入操作
        insertCmd.ExecuteNonQuery();
    }
    
    new_dbConnection.Close();
}

3. 几个要注意的点

  • 参数化查询很重要:别直接把十六进制字符串拼进SQL里,一来容易触发SQL注入,二来处理大BLOB时性能会很差,用参数化能避免这些问题。
  • 适配不同数据库类型:如果新库不是SQLite(比如SQL Server),只要目标字段是VARBINARY或类似的二进制类型,这个byte[]的插入逻辑依然适用,大部分ORM和数据库驱动都支持直接传入字节数组。
  • 大数据量分批处理:如果旧库的CHART_DATA表数据很多,建议每次读取几十条就插入一次,别一次性把所有数据读到内存里,避免内存溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:12:37