Новичок: Как ловко собрать данные из нескольких таблиц? - PullRequest
2 голосов
/ 18 октября 2011

Мне интересно, как я мог бы ловко собирать данные из нескольких таблиц с помощью C #.Я не очень привык к C # и управлению базами данных: я слышал об ADO.NET и LINQ и простоте работы с таблицами, но у меня еще не было времени читать об этом.Подход к сбору данных очень сложен:

        int id = 43;
        var collectedData = new System.Collections.Generic.Dictionary<string, string>(); // this will later be all my collected data

        // Load from first table
        string select1 = "SELECT * FROM table1 WHERE ID = " + id;
        DataRow dataRow1= SqlHelper.Execute.SingleRow(select1); // my helperclass returning one single data row of a table
        collectedData["Surname"] = dataRow1["Surname"];
        collectedData["Name"] = dataRow1["Name"];
        collectedData["Age"] = dataRow1["Age"];

        // Load from second table
        string select2 = "SELECT * FROM table2 WHERE ID = " + id;
        DataRow dataRow2= SqlHelper.Execute.SingleRow(select2); 
        collectedData["Mother"] = dataRow2["Mother"];
        collectedData["Father"] = dataRow2["Father"];
        collectedData["Job"] = dataRow2["Job"];

        // ...

Так как бы вы C # и .NET-профессионалы решили это?Я с нетерпением жду ваших примеров кода!

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Если вы работаете с SQL Server, ADO.NET + LINQ-to-SQL, безусловно, подходит.

Причины для LINQ:

  1. Естественно подходит для вашего кода .NET, IDE и отладчика.
  2. Вам не нужно хранить свой код в одном месте, а свои запросы - в другом
  3. Вы не жестко программируете SQL-запросы, и вам не нужно заниматься созданием параметризованного SQL (что, на мой взгляд, действительно является болью)
  4. Это очень быстро писать и удивительно гибко
  5. Ваш код будет чище и меньше, потому что вам не нужно везде подключать ADO.NET и базы данных - LINQ позаботится обо всех сложных вещах
  6. Вы получаете хороший конструктор сущностей, который позволяет перетаскивать из соединения SQL

Причины не использовать LINQ:

  1. Если вам нужно выжать из запроса каждую последнюю унцию производительности, LINQ может оказаться не самым естественным выбором, поскольку SQL иногда может быть более гибким. Но вы должны внимательно рассмотреть ваш запрос, чтобы увидеть, есть ли более простой способ сделать это.
  2. Некоторым местам не нравятся последствия для безопасности, потому что таблицы должны быть открытыми для вашего подключенного пользователя. Некоторые компании разрешают доступ к таблицам только через SPROC.

Для вашего примера вы захотите создать классы (POCO), которые будут представлять объекты вашей базы данных. Затем вы будете использовать LINQ для запроса ваших таблиц и загрузки данных в новые объекты сущностей. Я предпочитаю иметь конструктор в моих объектах домена / сущности, который преобразует постоянные объекты базы данных, сгенерированные LINQ, в объекты уровня домена для использования клиентом.

public class Person
{
    public int ID { get; set; }
    public string Surname { get; set; }
    public string Name { get; set; }
    public short Age { get; set; }

    public Person()
    {
    }

    public Person( Persistence.Person src )
    {
      this.ID = src.ID;
      this.Surname = src.surname;
      this.Name = src.name;
      this.Age = src.age;
    }
}

...
public List<Domain.Person> LoadPeople()
{
    using( var context = this.CreateContext() )
    {
        var personQuery = from p in context.Persons
                          select new Domain.Person( p );

        return personQuery.ToList();
    }
}

public Person LoadPerson( int personID )
{
    using( var context = this.CreateContext() )
    {
        var personQuery = from p in context.Persons
                          where p.id == personID
                          select new Domain.Person( p );

        return personQuery.SingleOrDefault();
    }
}
1 голос
/ 18 октября 2011

Если у вас есть следующие таблицы:

tblUsers
UserID LName FName GenderID
1      Joe   Chan  1
2      Koh   Wang  2
3      John  Chen  1


tblGenders
GenderID Gender
1        Male
2        Female

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

        SqlConnection con = new SqlConnection(Connection String for you database);
        con.Open();
        SqlCommand comm = con.CreateCommand();
        comm.CommandText = "SELECT u.UserID, u.Fname, u.Lname, u.GenderID, g.Gender 
                            FROM tblUsers u, tblGenders g 
                            WHERE u.GenderID = g.GenderID";
        SqlDataAdapter da = new SqlDataAdapter(comm);
        DataSet ds = new DataSet();
        da.Fill(ds);

Вы можете получить доступ к строкам под таблицей, используя этот код da.Table [0] .Rows;

если вы уже знакомы с хранимыми процедурами, вы также можете использовать этот код:

    internal static List<RoomType> FetchRoomTypeList()
    {
        List<RoomType> roomTypes = new List<RoomType>();
        SqlCommand commRoomTypeSelector = ConnectionManager.MainConnection.CreateCommand();
        commRoomTypeSelector.CommandType = CommandType.StoredProcedure;
        commRoomTypeSelector.CommandText = "Rooms.asp_RMS_RoomTypeList_Select";
        SqlDataAdapter da = new SqlDataAdapter(commRoomTypeSelector);
        DataSet ds = new DataSet();
        da.Fill(ds);
        roomTypes = (from rt in ds.Tables[0].AsEnumerable()
                     select new RoomType
                     {
                         RoomTypeID = rt.Field<int>("RoomTypeID"),
                         RoomTypeName = rt.Field<string>("RoomType"),
                         LastEditDate = rt.Field<DateTime>("LastEditDate"),
                         LastEditUser = rt.Field<string>("LastEditUser"),
                         IsActive = (rt.Field<string>("IsActive") == "Active")
                     }
                    ).ToList();

        return roomTypes;
    }

для получения дополнительной информации посетите:

http://www.homeandlearn.co.uk/csharp/csharp.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...