需要帮助找到一个好的设计和架构

时间:2011-03-08 07:31:03

标签: c# asp.net sql

我想制作一个多合一的查询,甚至是从3个表中提取的两步查询。

表#1:游戏 - 此表包含一种游戏类型,并有游戏描述等。

表#2:GameProfiles - 它从表'Games'中保存一个id,因此它们都有一个GamesId列。此表包含赢得的游戏,游戏丢失等等

表#3:Games_WhateverGame - 这不是一个特定的表,有多个表,例如,如果我有一个游戏BasketBall,它将有一个单独的表名为Games_BasketBall,它有自定义列,具体取决于游戏。例如,篮球将有一个篮板专栏。该表将拥有自己的主键ID。

我可以使用内部联接在他们常用的“GameId”列上轻松地将Games和GameProfile拉到一起,但是我如何制作它以便我也可以在同一查询中拉动'Games_BasketBall',动态取决于GamesId。我可能正在构建这个错误,所以我愿意接受建议。我似乎无法想到一种非常流畅的方式使这项工作正确,因为每个游戏都有不同的配置文件实体,所以我想让每个表的关系变得容易,所以我可以在一个查询中提取所有内容。

此代码的查询没有关于Games_Basketball的关系,我希望能够将它全部拉到一个阅读器中,以便它具有正确的信息。

 using (SqlConnection myConnection = new SqlConnection(myConnectionString))
    {

        myConnection.Open();
        String selectSql = "SELECT * FROM aspnet_GameProfiles INNER JOIN aspnet_Games ON aspnet_GameProfiles.GameId = aspnet_Games.GameId WHERE UserId = @UserId";

        SqlCommand myCommand = new SqlCommand(selectSql, myConnection);
        myCommand.Parameters.AddWithValue("@GameProfile", UserId);


        reader = myCommand.ExecuteReader();
        gameTable.DataSource = reader;
        gameTable.DataBind();
        myConnection.Close();
    }

3 个答案:

答案 0 :(得分:0)

对于你们当前的shema,我会选择类似的东西:

public enum GameType { Basketball, Snooker, ... }

void BindGameData(GameType gameType)
{

[ sql connection code ]

StringBuilder sb = new StringBuilder();
// those constant parts should be stored outside in config file
sb.append("SELECT * FROM aspnet_GameProfiles INNER JOIN aspnet_Games ON aspnet_GameProfiles.GameId = aspnet_Games.GameId "); 
sb.append("INNER JOIN ");
sb.append("aspnet_" + gameType.toString()); // adopt to yours naming pattern
sb.append("ON aspnet_Games.GameId = ");
sb.append("aspnet_" + gameType.toString() + ".GameId");
sb.append("WHERE UserId = @UserId");

String selectSql = sb.toString();

[rest of yours sql connection code]

}

答案 1 :(得分:0)

您还可以使用MARS(多个活动结果集)来实现目标。在MARS中,您同时使用两个sqldatareader。

这是一个小样本:

  SqlDataReader rdrone = null;
  SqlDataReader rdrtwo = null;
  string connectionstring = "server=sugandha;initial catalog = Employeedetail;uid = sa;pwd= sa";MultipleActiveResultSets = true;
  SqlConnection con = new SqlConnection(connectionstring);
  SqlCommand cmdone = new SqlCommand("select * from Employee", con);
  SqlCommand cmdtwo = new SqlCommand("select * from Employeedept", con);
  con.Open();
  rdrone = cmdone.ExecuteReader();
  DataTable dtone = new DataTable();
  dtone.Load(rdrone);
  dataGridView1.DataSource = dtone;
  rdrtwo = cmdtwo.ExecuteReader();
  DataTable dttwo = new DataTable();
  dttwo.Load(rdrtwo);
  dataGridView2.DataSource = dttwo;
  con.Close();

答案 2 :(得分:0)

如果您想同时获取所有游戏的所有信息,在一个查询中执行此操作是不切实际的。并且,你知道,用户不想等你做135个LEFT JOIN操作来从所有游戏“无论什么”表中获取信息。

所以,即使它有可能,它也不实用,你真的可能不想那样做。用户不太可能想要读取所有数据,对吧?

只需在用户需要时显示用户需要的内容。如果用户点击“篮球”,然后,您可以查询已加入两个或三个表格的视图,以显示有关“篮球”游戏的信息。