使用表名称列表删除 SQLite 表
本文关键字:删除 SQLite 列表 | 更新日期: 2023-09-27 18:35:49
我正在尝试使用列表中的表名drop a collection of tables
,然后获取每个字符串的类型并将其删除:
List<string> models = new List<string> { "WebBrowser", "Notebook", "Members"};
foreach (string mod in models)
{
Type type = Type.GetType(mod));
using (var dbConn = new SQLiteConnection(app.DBPath))
{
dbConn.RunInTransaction(() =>
{
dbConn.DropTable<type>();
//dbConn.DropTable<WebBrowser>();
dbConn.Dispose();
dbConn.Close();
});
}
}
问题:我不能使用这种方式删除表,DropTable 需要类的名称(例如 WebBrowser),我不想单独删除每个表(即 dbConn.DropTable<<strong>WebBrowser>();)因为我有 50 多张桌子要放。
错误:"找不到类型或命名空间名称'类型'"。(并且此错误是意料之中的,因为我的命名空间中没有类"类型"。
您可以在 SQLite 中使用 SQL 命令删除表。您需要做的就是遍历您的集合并每次构建一个 SQL 字符串,然后执行它
List<string> models = new List<string> { "WebBrowser", "Notebook", "Members"};
foreach (string mod in models)
{
using (var dbConn = new SQLiteConnection(app.DBPath))
{
SQLiteCommand command = new SQLiteCommand(dbConn);
command.CommandText = string.Format("DROP TABLE {0};", mod);
command.ExecuteNonQuery();
}
}
我不确定此语法是否完全适合您的情况(我只在 Windows 8.1 中使用过 sqlite-net),但一般方法是合理的
您可以像这样创建自己的扩展方法:
public static class SQLiteConnectionExtensions
{
public static int DropTable(this SQLiteConnection conn, string tableName)
{
var query = string.Format("drop table if exists '"{0}'"", tableName);
return conn.Execute(query);
}
}
然后像这样使用它:
var tables = new List<string> { "WebBrowser", "Notebook", "Members" };
using (var dbConn = new SQLiteConnection(app.DBPath))
{
dbConn.RunInTransaction(() =>
{
foreach (string table in tables)
{
dbConn.DropTable(table);
}
});
}
您也可以使用反射。以下是两种扩展方法:
public static void DropTable(this SQLiteConnection Connection, Type TableType)
{
typeof(SQLiteConnection).GetMethod("DropTable", Array.Empty<Type>())?.MakeGenericMethod(TableType).Invoke(Connection, null);
}
public static void DropTable(this SQLiteConnection Connection, Type[] AllTableTypes)
{
MethodInfo? Method = typeof(SQLiteConnection).GetMethod("DropTable", Array.Empty<Type>());
if (Method != null)
{
foreach (Type? OneTableType in AllTableTypes)
{
Method.MakeGenericMethod(OneTableType).Invoke(Connection, null);
}
}
}
您可以在 SQLiteConnection 对象上调用它们:
TheSqlLiteConnection.DropTable(typeof(SomeClass));
TheSqlLiteConnection.DropTable(new Type[] { typeof(SomeClass), typeof(SomeOtherClass) });