【问题标题】:Alter a BLOB field in Database更改数据库中的 BLOB 字段
【发布时间】:2016-01-17 15:25:23
【问题描述】:

我在 sqlite 数据库文件中有一个 BLOB 列,我想更改此字段以提供更多信息。

BLOB 包含以下文本:

"{\"Number\":\"35\",\"ChannelType\":\"TV\",\"ServiceName\":\"DVBLink\",\"ImageInfos\":[], \"IsInMixedFolder\":false,\"Name\":\"13th Street HD\",\"Id\":\"466ab1fb9be4f77e65ad2b229a15c326\",\"DateCreated\":\"2015-09-14T12:55: 51.4081476Z\",\"DateModified\":\"0001-01-01T00:00:00.0000000Z\",\"DateLastSaved\":\"2015-10-17T13:34:37.4214116Z\",\"LockedFields \":[],\"ParentId\":\"00000000000000000000000000000000\",\"Studios\":[],\"Genres\":[],\"ProviderIds\":{\"ProviderExternalId\":\ "13250000\"}}"

这里是获取此信息的代码

        private void button1_Click(object sender, EventArgs e)
    {
        try {
            SQLiteConnection con = new SQLiteConnection("Data Source=D:\\2work\\VisualStudio\\Projects\\MapTVIcons\\library.db");

            con.Open();

            SQLiteCommand cmd = new SQLiteCommand();

            cmd.Connection = con;
            cmd.CommandText = "SELECT guid,data FROM TypedBaseItems where type = 'MediaBrowser.Controller.LiveTv.LiveTvChannel'";
            //cmd.CommandText = "SELECT * FROM TypedBaseItems";

            DataSet ds = new DataSet();
            SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
            ds.Tables.Add("TypedBaseItems");
            da.Fill(ds);
            //dataGridView1.DataSource = ds.Tables[1];
           foreach (DataRow dr in ds.Tables[1].Rows)
            {


                byte[] array = (byte[])dr["data"];
                var str = System.Text.Encoding.Default.GetString(array);
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}

我想要做的是读出 Id 值(在 blob Id\":\"466ab1fb9be4f77e65ad2b229a15c326 内)并添加到“ImageInfos”的路径并将新的 BLOB 放回数据库文件。

【问题讨论】:

  • 然后使用更新语句。
  • 您需要能够唯一标识您想要更改的每一行 - 可能是通过主键,因此修改查询以获取 id 字段和数据 - 并使用@TechieBee 所说的 SQL UPDATE 命令.
  • 抱歉,我的意思是blob中的id:Id\":\"466ab1fb9be4f77e65ad2b229a15c326\
  • 你卡在哪里了?更新 JSON blob 还是将其写回数据库?

标签: c# sqlite blob


【解决方案1】:

这样做的一个不太短的方法是扩展您已经尝试过的内容:

  1. 读取 C# 对象中的 json blob(在您的项目中包含 Newtonsoft.Json nuget 包)

        var json = "JSON STRING";
    
        var ro = JsonConvert.DeserializeObject<RootObject>(json);
    
  2. 以上将转换为以下 C# 类

    public class ProviderIds
    {
        public string ProviderExternalId { get; set; }
    }
    
    
    public class RootObject
    {
    public string Number { get; set; }
    
    public string ChannelType { get; set; }
    public string ServiceName { get; set; }
    public List<object> ImageInfos { get; set; }
    public bool IsInMixedFolder { get; set; }
    public string Name { get; set; }
    public string Id { get; set; }
    public string DateCreated { get; set; }
    public string DateModified { get; set; }
    public string DateLastSaved { get; set; }
    public List<object> LockedFields { get; set; }
    public string ParentId { get; set; }
    public List<object> Studios { get; set; }
    public List<object> Genres { get; set; }
    public ProviderIds ProviderIds { get; set; }
    }
    
  3. 然后您可以简单地操作您喜欢的字段。

  4. 并将其更新回数据库

【讨论】:

  • .. 并写回数据库
  • 到目前为止一切顺利,我创建了两个类 ProviderIDs 和 RootObject 就像第 2 点一样。并调用这个`byte[] array = (byte[])dr["data"];字符串 str = System.Text.Encoding.Default.GetString(array); JavaScriptSerializer json_serializer = new JavaScriptSerializer(); RootObject retObject = (RootObject)json_serializer.DeserializeObject(str);`
  • 导致错误:+ $exception {"Object of Type \"System.Collections.Generic.Dictionary`2[System.String,System.Object]\" 无法转换为类型 \ "MapTVicons.RootObject\" } System.InvalidCastException
  • 这是有效的:** RootObject retObject = (RootObject)json_serializer.Deserialize(str);**
  • @user1073472 更改转换方法,请获取更新后的代码,它在我的控制台应用中运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多