首页 > 解决方案 > 无法从带有意外字符的 sqlite3 文件中检索数据

问题描述

我有我试图从中获取数据的sqlite3 数据库文件。当我尝试在 sqliteBrowser 中打开它时,它会生成表,但它会忽略文件中的数据,所以我得到空表。这是文件:localData.sqlite

sqlite浏览器视图

我不知道文件格式是否错误,或者我是否缺少某些功能,我必须运行它。

该文件是由 Windows 上的第三方应用程序使用以下代码创建的。

文件创建

        {
            try
            {
                if (!File.Exists("queueData.sqlite"))
                {
                    SQLiteConnection.CreateFile("queueData.sqlite");
                }

                using (SQLiteConnection c = new SQLiteConnection(connection))
                {
                    c.Open();
                    using (SQLiteCommand cmd = new SQLiteCommand("create table if not exists vehicles (data TEXT)", c))
                    {
                        cmd.ExecuteNonQuery();
                    }
                    using (SQLiteCommand cmd = new SQLiteCommand("create table if not exists vehiclesMQTT (data TEXT)", c))
                    {
                        cmd.ExecuteNonQuery();
                    }
                    using (SQLiteCommand cmd = new SQLiteCommand("create table if not exists faces (data TEXT)", c))
                    {
                        cmd.ExecuteNonQuery();
                    }
                    using (SQLiteCommand cmd = new SQLiteCommand("create table if not exists facesMQTT (data TEXT)", c))
                    {
                        cmd.ExecuteNonQuery();
                    }
                    c.Close();
                }
            }
            catch (Exception ex)
            {
                AdLogsManager.instance.writeErrorMessage("Creating DB and Table: " + ex.Message,"", "", 7001);
            }
        }

数据插入

        {
            try
            {
                var tableName = getTableNameByType(type);
                string sql = "insert into " + tableName + " (data) values (\'" + data + "\')";
                using (SQLiteConnection c = new SQLiteConnection(connection))
                {
                    c.Open();
                    using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
                    {
                        cmd.ExecuteNonQuery();
                    }
                    c.Close();
                }
                return true;
            }
            catch (Exception ex)
            {
                AdLogsManager.instance.writeErrorMessage("Saving data: " + ex.Message,"", "", 7002);
                return false;
            }
        }

如果有人可以帮助我解决问题或找到获取数据的方法,我将不胜感激。

谢谢。

标签: javascriptdatabasesqlitesqlite-browser

解决方案


根本没有任何保证!

您的数据库已损坏,或者不知何故,记录已被删除。

但是,您仍然可以在文本编辑器中打开文件并看到很多记录,例如:

…… {"channel":"app-emit","payload":{"type":"vehicle","deviceId":"d4f9bb04b6d5","time":1595510864502,"appName":"vehicle","appVersion":"1.0.1","data":{"count":1,"speed":0.0,"zoneId":"inbound","time":1595510864502}}}_

我不知道它们属于哪个表,或者它们是实际的还是过时的,甚至不知道丢失了多少。

使用这种方法,可以恢复4087条记录:https ://justpaste.it/38j03

进一步了解您的应用程序应该可以帮助您评估它们是否有用。

编辑:使用的方法:

我使用十六进制/文本编辑器 (MadEdit) 来:

  1. 在之前放置一个中断{"channel":(将十六进制 7B226368616E6E656C223A 替换为0A 7B226368616E6E656C223A)
  2. 之后休息一下}}}(将十六进制 7D7D7D 替换为 7D7D7D 0A
  3. 删除所有出现的空值(将十六进制 00 替换为空)

然后复制粘贴到电子表格应用程序 (Excel) 中的所有内容,因此可以进行一些排序和过滤。

更好的方法:在 Word 中打开,进行相同的替换({"channel":to^p"channel":}}}to }}}^p),然后粘贴到 Excel。


推荐阅读