使用表名称列表删除 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 表

您可以在 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) });