2015-04-06 27 views
1

我正在使用C#連接到訪問數據庫並檢查數據庫中是否存在表。這是我正在使用的語法,但對於其中有很多表的數據庫,執行需要一段時間。他們是一個更快的方法來做到這一點,因爲速度是這個過程最重要的事情?刪除表的最快方法(如果存在)

string[] tableNames = new string[4] { "One", "Two", "Three", "Four" }; 
for (int q = tableNames.GetLowerBound(0); q <= tableNames.GetUpperBound(0); q++) 
{ 
    foreach (DAO.TableDef tabledef in dd.TableDefs) 
    { 
    string strtable = tableNames[q]; 
    if (tabledef.Name == strtable) { found = true; } 
    if (found) { dd.TableDefs.Delete(strtable); } 
    } 
} 

對於任何未來的旅行者誰可能偶然發現這一點,這是我使用的最後語法---指數更快!

上次修改---我改變了Execute語句,將其封裝在try/catch塊中,就好像數組中列出的表名實際上不存在一樣,它會拋出錯誤。

System.Data.OleDb.OleDbConnection oleconn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + PathToDatabase" + ".mdb;"); 
oleconn.Open(); 
string[] tableNames = new string[4] { "One", "Two", "Three", "Four" }; 
for (int q = tableNames.GetLowerBound(0); q <= tableNames.GetUpperBound(0); q++) 
{ 
    System.Data.OleDb.OleDbCommand cmd = new OleDbCommand("DROP TABLE " + tableNames[q], oleconn); 
    try { cmd.ExecuteNonQuery(); } 
    catch {} 
} 
oleconn.Close(); 
+4

簡單運行'DROP TABLE [Tablename]'它會刪除,如果存在,否則什麼都不做 – Franck 2015-04-06 13:41:48

+0

爲什麼你不能寫一個簡單的查詢來檢查sysobject是否存在 – MethodMan 2015-04-06 13:44:00

+0

@MethodMan drop table已經檢查實體是否存在,因此檢查它是否存在雙重檢查,因此不會更快。除非他打算做一些特殊的事情,如果表格存在或不存在,檢查只會減慢過程。 – Franck 2015-04-06 13:47:40

回答

1

我認爲,而不是在您的ado.net查詢後檢查C#應用程序運行。

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
    DROP TABLE 'mytablename' 

因爲它會加載元數據,當您使用ado.net而不是執行簡單查詢與執行非查詢。

+2

我不知道OBJECT_ID和該語法可以用於MS-Access數據庫。但考慮到海報接受了你的答案,那麼我可能是錯的。 – Steve 2015-04-06 13:59:24

+2

(cc:@Steve)這是T-SQL代碼。它不適用於Access SQL。 – 2015-04-06 14:47:27

+0

@GordThompson Uhm懷疑 – Steve 2015-04-06 14:55:34

-2

可以使用Drop Table刪除表.. 其語法

if exists (select * from login where name = 'prishu' and pass='prishu') 
    drop table login 

更多信息,使用此link

檢查this link also

+0

我們正在談論一個MS-Access數據庫。你嘗試過這種語法嗎? – Steve 2015-04-06 14:11:58

+0

此語法不起作用。 – 2015-04-06 14:13:42

2

反轉循環(僞代碼):

foreach (DAO.TableDef tabledef in dd.TableDefs) 
{ 
    if (tabledef.Name in tablearray) 
    { 
    dd.TableDefs.Delete(strtable); 
    } 
}