2015-10-15 59 views
-2

你好,我想找到問到MySQL,如果一個表中,我發現很多例子,但所有的等待與嘗試捕捉一個例外,這樣Vb.net檢查,如果表中的Mysql數據庫不存在嘗試捕捉

的最佳方式
Try 
     'do a select COUNT(*) 
Catch ex as Exception 
     'return True to indicate table exist 
Finally 
    'clean up 
End try 

,但我認爲沒有一個很好的方法,以及我再說一遍,我這麼認爲,另一種方法是這樣的:

Using cn As New MySqlConnection(cs) 
      Dim restrictions(4) As String 
      restrictions(2) = tblName 
      Dim dbTbl As DataTable = cn.GetSchema("Tables", restrictions) 
      If dbTbl.Rows.Count = 0 Then 
       'Table does not exist 
       Return False 
      Else 
       'Table exists 
       Return True 
      End If 
      cn.Close() 
      cn.Dispose() 

,但我有一個消息引用未設置對象。

+1

我沒有看到你在哪裏打開連接。另外,你在哪裏得到參考錯誤?哪條線? – siride

+0

連接好,不用擔心,異常是** dim dbtbl as datatable .....** – jearca

+0

將鼠標懸停在不同的對象變量上,看看哪個是'Nothing' – Plutonix

回答

0

UPDATE: Mysql的提供一種方法,我認爲是最好的方式EXCUTE此行

SELECT COUNT(*) 
FROM information_schema.tables 
WHERE table_schema = 'Database' 
AND table_name = 'Table' 
0

您可以執行這個查詢,並看看是否有任何結果回來:

show tables like 'my-table-name'; 
0

您的問題是由於在發出命令之前應該打開一個連接而造成的。你的第二個例子應該上班,如果你只想補充一點,缺少cn.Open

Using cn As New MySqlConnection(cs) 
    Dim restrictions(4) As String 
    restrictions(2) = tblName 
    cn.Open() 
    Dim dbTbl As DataTable = cn.GetSchema("Tables", restrictions) 
    If dbTbl.Rows.Count = 0 Then 
     Return False 
    Else 
    Return True 
    End If 
End Using 

而且,也沒有必要關閉和處置的連接,這將在End Using語句自動完成。當然,試圖發現表是否存在捕獲異常的第一種方法是完全錯誤的(性能,由異常驅動的代碼和其他類型的異常),因此不應該採取任何考慮。

有在使用的getSchema調用的代碼一個令人困惑的問題:
約一個空引用異常消息會談,但顯然也有在該代碼沒有空的對象,因爲GetSchema應該也返回初始化DataTable的情況下,沒有找到匹配。
但是,如果你省略了cn.Open,你會得到NRE。

那麼NRE從哪裏來呢?

望着的MySqlConnection的反編譯的代碼,調用的getSchema是這樣的

public override DataTable GetSchema(string collectionName, string[] restrictionValues) 
{ 
    string[] strArray; 
    MySqlSchemaCollection schemas; 
    if (collectionName != null) 
    { 
     goto Label_000A; 
    } 
    collectionName = SchemaProvider.MetaCollection; 
Label_000A: 
    strArray = this.schemaProvider.CleanRestrictions(restrictionValues); 
    return this.schemaProvider.GetSchema(collectionName, strArray).AsDataTable(); 
} 

this.schemaProvider.GetSchema(....)調用的代碼如下

public virtual MySqlSchemaCollection GetSchema(string collection, string[] restrictions) 
{ 
    MySqlSchemaCollection schemas; 
    if (this.connection.State == 1) 
    { 
     goto Label_0019; 
    } 
    throw new MySqlException("GetSchema can only be called on an open connection."); 
Label_0019: 
    collection = StringUtility.ToUpperInvariant(collection); 
    schemas = this.GetSchemaInternal(collection, restrictions); 
    if (schemas != null) 
    { 
     goto Label_0038; 
    } 
    throw new ArgumentException("Invalid collection name"); 
Label_0038: 
    return schemas; 
} 

因此,這讓只有一種可能。 schemaProvider變量未初始化。搜索MySqlConnectionOpen方法我能找到的初始化schemaProvider變量

public override void Open() 
{ 
    ... lot of code omitted ..... 

Label_01F3: 
    this.schemaProvider = new ISSchemaProvider(this); 
    this.perfMonitor = new PerformanceMonitor(this); 
    if ((Transaction.Current != null) == null) 
    { 
     goto Label_0230; 
    } 
    if (this.Settings.AutoEnlist == null) 
    { 
     goto Label_0230; 
    } 
    this.EnlistTransaction(Transaction.Current); 
Label_0230: 
    this.hasBeenOpen = 1; 
    this.SetState(1, 1); 
    return; 
} 

所以這是可能的,這是某種類型的錯誤行?
我會讓答案更專家在此。

+0

如果連接沒有打開,那麼'schemaProvider'將爲空,所以NRE會發生在GetSchema的第一個片段中標籤) - 在執行方法之前,他們沒有檢查'schemaProvider'是否爲null,不是? – Plutonix

+0

是的,我認爲這應該被視爲一個錯誤。但是,當然我不確定內部變量_schemaProvider_是否以其他方式初始化。還有一點讓我想到這是一個錯誤,事實是,如果您使用con.GetSchema(「TABLES」)而沒有對NOT打開的連接進行限制,則調用將失敗,並顯示正確的錯誤消息 – Steve

+0

絕對是一個錯誤,因爲拋出的異常是通用的NRE和更多的信息。我使用'dbCon.GetSchema(「TABLES」)'(NET 4.5連接器)獲得相同的NRE。 – Plutonix