2011-03-08 44 views
1

我想做一个全部在一个查询,甚至是从三个表中拉出两步查询。需要帮助找到一个好的设计和架构

表#1:游戏 - 该表中保持类型的游戏和具有游戏的描述等

表#2:GameProfiles - 此保持从表“游戏”的ID,所以它们都有一个GamesId列。此表包含游戏赢了,游戏迷失等等

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

我可以很容易地将Games和GameProfiles一起在其常见的“GameId”列上使用内部联接,但是如何使其成为可以在相同查询中动态取决于GamesId的“Games_BasketBall” 。我可能正在构思这个错误,所以我愿意接受建议。我似乎不能想到一个真正流畅的方式使这项工作正确,因为每个游戏将有不同的配置文件实体,无论如何我想使关系到每个表容易,所以我可以拉一切查询。

此代码的查询没有与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(); 
    } 
+0

当您查询多个gameType时,您将获得每个gameType的唯一列。因此,对于用户拥有10个gameType的查询,如果每个gameType表有5列,则会得到〜50列。 – 2011-03-08 08:39:10

+0

为什么你不能在一个查询中返回多个结果集?您将在一个阅读器中获取所有结果集,只是在多个结果集中。但这是一次数据库访问。 – 2011-03-10 05:09:05

回答

0

为了您的当前玛我会去是这样的:

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] 

} 
+0

如果您查询多种游戏类型,它应该是'LEFT OUTER JOIN'! – 2011-03-08 08:35:56

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(); 
0

如果你想在同一时间获得所有比赛的所有信息,这是不实际的,在一个查询。而且,您知道,用户不想等待您执行135 LEFT JOIN操作以从所有游戏“无论”表中获取信息。

所以,尽管这是可能的,但这并不实际,而且您确实可能不想这样做。用户不太可能想要读取所有的数据,对吧?

仅当用户需要时才显示用户需要什么。如果用户点击“篮球”,然后您可以查询已经加入了两个或三个表格的视图,您需要显示有关“篮球”游戏的信息。