2014-02-18 7 views
0

У нас есть несколько процедур хранения для каждого уровня данных. Например, у нас есть таблица Employee с 20 столбцами, и существует около семи процедур хранения, на которые эта ссылка ссылается. У нас есть один метод привязки данных, используемый для всех процедур хранения сотрудников. Каждый раз, когда я добавляю новый столбец в таблице, мне нужно добавить ссылку на столбец во все семь процедур хранения (хотя это не обязательно для всех них). которая немного больно.Лучший способ проверить, существует ли столбец в DataReader

Как мы используем один метод привязки данных, какой был бы лучший способ сделать этот процесс более эффективным?

Что делать, если я добавляю ссылку на столбец только в тех sp, где это необходимо, а затем проверяет во время связывания данных, если столбец существует в dataReader. Я не хочу перебирать каждую строку, а затем прокручивать все столбцы, чтобы узнать, существует ли столбец. Если у меня есть 1000 строк и 20 столбцов, то это будет цикл из 1000 x 20, который не очень эффективен.

Было бы хорошо, если бы добавить данные DataReader в ArrayList, а затем использовать метод contains, чтобы найти, существует ли столбец в ArrayList?

+0

Проверьте это: http://stackoverflow.com/q/373230/897326. – Neolisk

+0

Я думаю, ваша проблема в том, что у вас есть метод привязки данных для ваших хранимых процедур. Вместо этого вы должны использовать Entity Framework или что-то вроде этого, которое немного абстрагирует доступ к данным. В отсутствие этого вам не следует использовать один метод доступа к данным, когда ваши хранимые процедуры явно не нуждаются во всех столбцах. Нет смысла сгибать вашу базу данных в соответствии с вашим кодом. –

+0

@JohnSaunders: да, вы абсолютно правы. Есть ли какой-либо пример Entity Framework, который подходит для моей ситуации. Я также попытаюсь провести некоторое исследование. – 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; 
    } 

Возможно, вы могли бы использовать его в первой записи и кэшировать результаты с помощью некоторых значений типа boolean.

Что-то вроде следующего:

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

См. Мое обновление для решения проблемы эффективности. –

Смежные вопросы