如何检查sqlite中是否存在table

how to check if a table exists in sqlite

有人请告诉我如何“检查 sqlite 数据库中是否存在 table”。

我想在我的数据库中插入日志。我想创建一个日志以便以后查看。我不想将所有数据集中在一个 table 中。结果,我想为每一天创建一个单独的 table,但我无法处理查询 table exists.I 是否尝试使用这行代码但是

DateTime time = DateTime.Now;
        string logname = time.ToString("MM-dd");
        SQLiteConnection m_dbConnection = new SQLiteConnection("Data Source=data.db3;Version=3;");
        m_dbConnection.Open();
        string sql = "SELECT name FROM sqlite_master WHERE type='table' AND name=@p1;";
        SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection);
        command = m_dbConnection.CreateCommand();
        command.Parameters.AddWithValue("@p1", logname);
        SQLiteDataReader rdr = command.ExecuteReader();

我总是在这行代码中得到 null 值,即使 table 存在

SQLiteDataReader rdr = command.ExecuteReader();

这是我的代码,我尝试 sql 这样的字符串

SELECT name FROM sqlite_master WHERE type='table' AND name=@p1;
SELECT name FROM data WHERE type='table' AND name=@p1;
SELECT name FROM data WHERE type = 'table' AND name = '@p1';

这是我的代码

public static void create_dayend_kk(double ht)
    {
        string apppath = AppDomain.CurrentDomain.BaseDirectory;
        DateTime time = DateTime.Now;
        string logname = time.ToString("MM-dd");
        SQLiteConnection m_dbConnection = new SQLiteConnection("Data Source=data.db3;Version=3;");
        m_dbConnection.Open();
        string sql = "SELECT name FROM data WHERE type = 'table' AND name = '@p1';";
        SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection);
        command = m_dbConnection.CreateCommand();
        command.Parameters.AddWithValue("@p1", logname);
        SQLiteDataReader rdr = command.ExecuteReader();
        int intout = rdr.GetInt32(0);
        if (intout == 0)
        {
            sql = "create table @p1 (ID INTEGER, KK REAL, NK REAL, TK REAL,PRIMARY KEY(ID AUTOINCREMENT))";
            command = m_dbConnection.CreateCommand();
            command.Parameters.AddWithValue("@p1", logname);
            command = new SQLiteCommand(sql, m_dbConnection);
            command.ExecuteNonQuery();
            sql = "insert into @p1 (KK, TK) values (@p2, @p3)";
            command.Parameters.AddWithValue("@p1", logname);
            command.Parameters.AddWithValue("@p2", ht);
            command.Parameters.AddWithValue("@p3", ht);
            command = new SQLiteCommand(sql, m_dbConnection);
            command.ExecuteNonQuery();
        }
        else if (intout == 1)
        {
            sql = "SELECT * FROM @p1";
            command = m_dbConnection.CreateCommand();
            command.Parameters.AddWithValue("@p1", logname);
            rdr = command.ExecuteReader();
            double kk = rdr.GetFloat(1);
            double nk = rdr.GetFloat(2);
            double tk = rdr.GetFloat(3);
            tk += ht;
            sql = "insert into @p1 (KK, TK) values (@p2, @p3)";
            command.Parameters.AddWithValue("@p1", logname);
            command.Parameters.AddWithValue("@p2", ht);
            command.Parameters.AddWithValue("@p3", tk);
            command = new SQLiteCommand(sql, m_dbConnection);
            command.ExecuteNonQuery();

        }

        m_dbConnection.Close();

        
    }

请告诉我该怎么做?怎么了?

开始,了解SQLite_Mastertable的结构,得到如下所示的架构。

sqlite> .schema sqlite_master
CREATE TABLE sqlite_master (
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);

接下来我做的是创建一个 class 结构来匹配

    private class CSQLite_Master
    {
        public string type { get; set; }
        public string name {get; set;}
        public string tbl_name { get; set; }
        public int rootpage { get; set; }
        public string sql { get; set; }
    }

由此,我使用了连接 .Query() 功能,如下所示

using (var db = new SQLiteConnection(YourPathToDatabase) )
{
   var tmp1 = db.Query<CSQLite_Master>(
        @"select * from sqlite_master where type = 'table' and name = ?", 
            new object[] { logname });
   if( tmp1 is null || tmp1.Count == 0 )
      return;

   // else we DO have an entry, and you can see all the parts of it
   // by doing basic debug inspection in the watch window 
}

.Query 执行任何可用的命令,并且在这种情况下基于 class/structure <CSQLite_Master>,数据被检索到此对象类型的列表中。现在为参数。这 ”?”是要提供的参数的place-holder。

Query() 调用的最后一个参数是按与“?”相同的顺序添加的值数组。 place-holder秒。在这种情况下,对象列表 new object[] { logname } 并且该列表是使用您准备的日志名创建的。

你应该得到记录,或者如果你没有包括查询的 AND name= 部分的记录,它会为你 return 所有 table 名字。

通过这个命令你可以检查table是否存在:

SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';

这个,return 特殊列表 table。