如何检查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。
有人请告诉我如何“检查 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。