2014-12-31 20 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個表下降。

錯誤:「類型或命名空間名稱'類型'無法找到」。 (並且這個錯誤是預期的,因爲我的名字空間中沒有Class'type'

+0

請嘗試指定好(至少對我來說),其中的問題是:代碼不能編譯?或者問題是關於檢索所有型號的名稱? – boctulus

+0

當然,代碼不會編譯,這段代碼會給你:無法找到類型或命名空間名稱'type' –

回答

2

你可以在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源碼網),但一般的方法是健全

+0

很好的答案。我將編輯語法,以便在Windows 8.1中對sqlite-net起作用,謝謝! –

1

您可以創建你自己的Extensionmethod是這樣的:

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

我認爲你應該選擇你的答案作爲有用的答案)爲你努力解決問題。 –