2013-09-18 1 views
0

Цель: Достичь более общего способа создания архаиста.Что является более общим способом создания arraylist в C#, как в примере?

Редакция: Мне нужно создать несколько arraylists, каждая из которых соответствует уникальной структуре с целью сравнения и обновления таблицы в базе данных Sql. В духе DRY я пытаюсь найти лучший способ создания каждого массива. Код, я использую следующим образом

Пример кода:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.Data; 
using System.Data.SqlClient; 
using System.Collections; 
using System.Configuration; 

public static void Users() 
{ 
    String sql = ""; 

    try 
    { 

     conn.Open(); 

     sql = "SELECT" + 
        "database.dbo.table1.username," + 
        "database.dbo.table1.status" + 
       "FROM" + 
        "database.dbo.table1"; 
     SqlCommand cmd = new SqlCommand(sql, conn); 

     SqlDataReader dr = cmd.ExecuteReader(); 

     while (dr.Read()) 
     { 
       //structure below 
       User structure_A = new User(); 

       structure_A.username = dr.GetValue(0).ToString(); 
       structure_A.status = dr.GetValue(1).ToString(); 

       //added to arraylist 
       arraylist_A.Add(structure_A); 
      } 

      dr.Close(); 
      conn.Close(); 
} 

Примечание: Более подробная информация может быть предоставлена ​​по запросу. Заранее благодарю за любую информацию.

+0

My take it it: for * static typed * query (columns/types fixed), используйте * существующий * ORM/mapper/DAL/template (выберите ваш яд). Некоторые из них уже действительно отражают POCOs просто (например, [PetaPoco] (http://www.toptensoftware.com/petapoco/) или еще что-то). Но для * динамических типизированных * запросов рассмотрите [DataTables] (http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx) - и вообще избегайте таких динамических запросов. Подобно типам C#, записи SQL действительно предназначены для «фиксированной формы» и борьбы с этим (за исключением разумных случаев), может быть больше проблем, чем того стоит. – user2246674

ответ

3

Одна вещь, которую вы можете сделать, это создать общий метод, который принимает параметры, которые отличаются. Например:

public static ArrayList LoadInfo<T>(string sql, Func<SqlDataReader, T> getItem) where T: new 
{ 
    var list = new ArrayList(); 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand(sql, conn); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     list.Add(getItem(dr)); 
    } 
    return list; 
} 

public static User LoadUser(SqlDataReader dr) 
{ 
    User structure_A = new User(); 
    structure_A.username = dr.GetValue(0).ToString(); 
    structure_A.status = dr.GetValue(1).ToString(); 
    return User; 
} 

Теперь, чтобы вызвать его для загрузки пользователей, вы просто передать ему запрос SQL и метод LoadUser:

string usersQuery = "SELECT ...."; // select users query 
ArrayList usersList = LoadInfo(usersQuery, LoadUser); 

И если вам необходимо загрузить кучу Fooby объектов, вы должны создать запрос Fooby и метод LoadFooby, который может создавать и заполнять Fooby из строки данных.

Я предлагаю вам использовать List, а не ArrayList.

+0

Именно то, что я искал, спасибо. –

1

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

Существует хорошее введение в использование EF Database первый здесь: http://msdn.microsoft.com/en-us/data/jj200620

+1

Я не знаю, если бы я выделил EF, но есть много * ORM и mappers, которые уже помогают решить эту проблему. – user2246674

+0

Я знаю, как выглядит структура, вещь, которую я пытаюсь избежать, - это переписывание выше код много раз с новыми arraylists –

+0

user2246674: соглашайтесь! просто пытался сделать хорошую рекомендацию, а не просто указывать в общем направлении. – MatteKarla

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