2014-02-18 43 views
0

我們有針對每個數據層的存儲過程數。例如,我們有一個包含20列的Employee表,並且這個表已經被引用了大約7個存儲過程。我們有一種針對所有員工商店程序的數據綁定方法。每次我在表格中添加一個新列時,我都必須將列引用添加到所有七個存儲過程中(即使它們不是全部都需要)。這有點痛苦。檢查DataReader中是否存在列的最佳方法

由於我們正在使用一種數據綁定方法,因此使此過程更高效的最佳方法是什麼?

如果我只是在需要的地方添加一個列引用,然後在數據綁定過程中檢查列是否存在於dataReader中。我不想循環遍歷每一行,然後遍歷所有列以找出列是否存在。如果我有1000行和20列,那麼它將是一個1000×20的循環,這不是非常有效。

如果我在ArrayList中添加dataReader結果,然後使用contains方法來查找列中是否存在ArrayList,那會好嗎?

+0

檢查了這一點:http://stackoverflow.com/q/373230/897326。 – Neolisk

+0

我認爲你的問題是你有存儲過程的數據綁定方法。相反,你應該使用Entity Framework或類似的東西,它抽象了一些數據訪問。如果沒有,那麼當你的存儲過程顯然不需要所有的列時,你不應該使用單一的數據訪問方法。彎曲數據庫以適合您的代碼是沒有意義的。 –

+0

@JohnSaunders:是的,你是對的。有沒有適合我的情況的任何實體框架示例。我也會試着對它做一些研究。 – user1263981

回答

0

這裏的擴展方法I found a while back以檢查是否存在列:

應該注意,這不是很有效。

public static bool HasColumn(this IDataRecord dr, string columnName) 
    { 
     for (int i = 0; i < dr.FieldCount; i++) 
     { 
      if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase)) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

也許你可以在第一條記錄上使用它,並通過一些布爾值來緩存結果。

類似以下內容:

public void test() 
    { 
     //DataBrokerSql is my own helper. 
     using (DataBrokerSql db = new DataBrokerSql(m_ConnString)) 
     { 
      bool columnsChecked = false; 
      bool hasFirstName = false; 
      bool hasLastName = false; 
      using (DbDataReader reader = db.GetDataReader("Select * From Person")) 
      { 
       while (reader.Read()) 
       { 
        //Only check for columns on the first row. 
        if (!columnsChecked) 
        { 
         hasFirstName = reader.HasColumn("FirstName"); 
         hasLastName = reader.HasColumn("LastName"); 
         columnsChecked = true; 
        } 

        if (hasFirstName) 
        { 
         //Read FirstName 
         var firstName = reader["FirstName"]; 
        } 

        if (hasLastName) 
        { 
         //Read LastName 
         var lastName = reader["LastName"]; 
        } 
       } 
      } 
     } 
    } 
+0

我知道這種方法,但效率不高。 – user1263981

+0

查看我的更新以解決效率問題。 –

相關問題