2014-12-31 6 views
2

Я пытаюсь drop a collection of tables с помощью имен таблиц в списке, а затем получить тип каждой строки и падение его:таблицы падения SQLite, используя список таблиц имен

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(); 
     }); 
    } 
} 

Проблема: Я не могу drop table, используя этот способ, DropTable нужно имя класса (например, WebBrowser), и я не хочу бросать каждую таблицу отдельно (т.е. dbConn.DropTable < WebBrowser>();), так как у меня более 50 таблиц упасть.

Ошибка: «Тип или пространство имен имя„типа“не может быть найден». (и эта ошибка ожидается, поскольку в моем пространстве имен не существует класса «type».

+0

Пожалуйста, попробуйте указать лучше (для меня по крайней мере), где проблема: код не компилируется? или проблема заключается в том, чтобы восстановить все имена моделей? – boctulus

+0

, конечно, код не будет компилироваться, этот код даст вам: Тип или имя пространства имен 'type' не удалось найти –

ответ

2

Вы можете удалить таблицы с помощью команды SQL в SQLite. Все, что вам нужно сделать, это перебрать вашу коллекцию и построить строку 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(); 
    } 
} 

Я не уверен, если этот синтаксис точно правильно для вашего случая (я только когда-либо использовать SQLite-сеть в ОС Windows 8.1), но общий подход звук

+0

Отличный ответ. Я отредактирую синтаксис, чтобы он работал для sqlite-net в Windows 8.1, спасибо! –

1

Вы можете создать ваш собственный метод расширения:

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); 
     } 
    }); 
} 
+0

Спасибо khlr отличный ответ, но ответ roryok выполнил эту работу. –

+0

Правильно, Абдалла, но я бы предпочел это, так как он не требует, чтобы вы отделили SqlCommand и себя и сделали то же самое с меньшим кодом :) – khlr

+1

Я думаю, что вы заслуживаете выбора своего ответа в качестве полезного ответа (проголосуйте) за ваши усилия по решению проблемы. –

Смежные вопросы