2016-05-04 104 views
2

首先,我沒有搜索這個第一,發現了這個問題回答說:Previous Answer檢查記錄的存在,在Access數據庫中使用C#

我有這個答案的問題是,使用這種方法會導致NullReferenceException。很明顯,代碼仍然可以用try/catch塊工作,但我一直都明白,有意使用Exception作爲控制流的手段是糟糕的設計。有沒有更好的方法來做到這一點?

爲了清楚參數,我使用OleDbConnection和OleDbCommand來讀/寫Access 2010數據庫(.accdb格式)。

下面是我目前已經使用上述答案的做法代碼:

public bool ReadAccessDb(string filePath, string queryString, bool hasRecords) 
    { 
     string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + 
      @"Data Source=" + filePath + ";" + 
      @"User Id=;Password=;"; 

     using (OleDbConnection connection = new OleDbConnection(connectionString)) 
     using (OleDbCommand command = new OleDbCommand(queryString, connection)) 
     { 
      try 
      { 
       connection.Open(); 

       int count = (int)command.ExecuteScalar(); 

       //This works, but if no records exist it uses the Exception system to halt further action. Look for better approach. 
       if(count > 0) 
       { 
        hasRecords = true; 
       } 
      } 
      catch (System.Exception ex) 
      { 
      } 
     } 

     return hasRecords; 
    } 
+3

那麼你傳遞一個SELECT查詢到你的方法?如果是這樣,你可以把它包裝在一個'SELECT COUNT(*)AS n FROM()'中,看看它是否返回零。 –

+0

我標記另一個,因爲它是一個實際的答案(因此我允許),但我確實喜歡使用SELECT語句的想法。謝謝您的幫助! –

回答

1

您可以使用:

int count = command.ExecuteScalar() is DBNull ? 0 : Convert.ToInt32(command.ExecuteScalar()); 

或使用:

object obj = command.ExecuteScalar(); 
int count = obj is DBNull ? 0 : Convert.ToInt32(obj); 
+0

第一個答案給出異常ObjectNotSetToInstance,但第二個答案完美工作。我通常不喜歡使用對象變量類型(我可能是錯誤的,但它通常似乎不精確,就像使用var類型),但如果它的工作,我很好。謝謝! –

+0

嘗試這樣做:'int count = command.ExecuteScalar()是DBNull? 0:Convert.ToInt32(command.ExecuteScalar());' –

0

我張貼這種回答是因爲問題有點模棱兩可,並且(當前)接受的答案可能會被「愚弄」,如果一行存在但是由SELECT語句返回的第一列碰巧包含NULL。考慮測試表

CREATE TABLE MyTable (ID COUNTER PRIMARY KEY, NullableColumn INTEGER NULL)

INSERT INTO MyTable (NullableColumn) VALUES (NULL)

它看起來像

ID NullableColumn 
-- -------------- 
1   <NULL> 

如果用於測試的SELECT語句是

string sql = "SELECT NullableColumn FROM MyTable WHERE ID=1"; 

那麼方法

static bool RecordExists(string queryString, OleDbConnection conn) 
{ 
    bool rtn; 
    using (var command = new OleDbCommand(queryString, conn)) 
    { 
     object obj = command.ExecuteScalar(); 
     int count = obj is DBNull ? 0 : Convert.ToInt32(obj); 
     rtn = (count != 0); 
    } 
    return rtn; 
} 

將返回False,而這種方法

static bool RecordExists(string queryString, OleDbConnection conn) 
{ 
    bool rtn; 
    string rowCountString = String.Format("SELECT COUNT(*) AS n FROM ({0})", queryString); 
    using (var command = new OleDbCommand(rowCountString, conn)) 
    { 
     int count = (int)command.ExecuteScalar(); 
     rtn = (count != 0); 

    } 
    return rtn; 
} 

將返回True

相關問題