使用多个表加载DataTable选择查询

时间:2014-01-02 10:20:22

标签: c# sql .net datatable handler

我以前从未使用过包含多个表格的精选查询,现在当我这样做时,我遇到了从DataTable获取信息的麻烦。

我有这个问题:

SELECT * 
FROM [Usergroups], [Groups] 
WHERE [Usergroups.UserID] = @name 
  AND [Groups.GroupID] = [Usergroups.GroupID]

这就是我将返回值输入DataTable的方法:

DataTable groupsTable = new DataTable();
groupsTable.Load(sqlCmd.ExecuteReader());

现在,如何指定我要从哪个表中获取行的DataTable?例如,这是我在涉及的多个表之前所做的:

string groupName = groupsTable.Rows[0]["Name"];

我找不到任何有此类信息的资源,但我知道这是一个基本问题。提前谢谢。

4 个答案:

答案 0 :(得分:6)

您问题中的查询不会产生多个表格 它在两个表之间产生JOIN。

因此,在C#方面,你没有两个表,只有一个像以前一样,两个表中的所有字段。

作为旁注,将表连接在一起的更好方法是使用JOIN语句,如下所示

SELECT *  -- a field list is better here ---
FROM Usergroups ug INNER JOIN Groups g ON g.GroupID=ug.GroupID
WHERE ug.UserID=@name

你应该在SELECT子句中添加一个你真​​正感兴趣的字段列表。

SEE a simple JOIN reference

如果要在单独的DataTable对象中检索两个表的值,则需要以这种方式使用DataSet

DataSet ds = new DataSet();
DataTable dtUserGroups = new DataTable("UserGroups");
DataTable dtGroups = new DataTable("Groups");
ds.Tables.Add(dtUserGroups );
ds.Tables.Add(dtGroups);
using(SqlCommand cmd = new SqlCommand("SELECT * FROM UserGroups;SELECT * from Groups", con))
{
    using(SqlDataReader dr = cmd.ExecuteReader())
    {
        ds.Load(dr, LoadOption.OverwriteChanges, dtUserGroups, dtGroups);

        // Now you have the two tables filled and 
        // you can read from them in the usual way

    }
}

最后一个示例可以进一步增强向DataSet添加DataRelation对象以表示两个表之间的关系。这可以允许您的代码导航父/子记录集。

答案 1 :(得分:2)

您可以尝试这种方式:

string query = "SELECT U.ID,U.NAME, C.NAME AS CUSTOMERNAME, C.DOB FROM USER U INNER JOIN CUSTOMER C ON U.ID = C.USERID"
SqlConnection conn = new SqlConnection(_connectionString);
SqlCommand cmd = new SqlCommand(query, conn);
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adp.Fill(dt);

上面的代码将返回一个DataTable,其中包含来自两个不同表格的数据,例如“用户”和“客户”。

我希望您现在知道如何从DataTable访问数据。

答案 2 :(得分:0)

最好根据您的要求,使用JOIN来组合多个表格,例如INNER JOINLEFT OUTER JOINRIGHT OUTER JOINFULL JOIN。因此,当您使用INNER JOIN时,它将包含两个连接表的列,即

  

tblA a,b,c 为列和

     

tblB a,e,f 作为列

然后内部联接表将包含a,b,c,e,f作为其列。

然后,您可以这样使用:

public DataTable LoadData()
    {
        DataTable dataTable;
        string connString = @"your connection string here";
        string query = "SELECT * FROM Usergroups t1 INNER JOIN Groups t2 ON t2.GroupID=t1.GroupID WHERE t1.UserID=@name";

        SqlConnection conn = new SqlConnection(connString);        
        SqlCommand cmd = new SqlCommand(query, conn);
        conn.Open();

        // create data adapter
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        // this will query your database and return the result to your datatable
        da.Fill(dataTable);
        conn.Close();
        return dataTable;
    }

获得DataTable后,您可以使用此表格,如:

DataTable dt = LoadDataClass.LoadData(); 
string groupName = dt.Rows[0]["Name"];  //For first row

我希望你明白。

答案 3 :(得分:0)

在wpf c#中,此方法也可用于从多个表中检索数据

            try
            {
                using (SqlConnection conn = new SqlConnection(_pageDataBase.connectionString()))
                {
                    conn.Open();

                    DataTable dt = new DataTable();

                    SqlDataAdapter Usergroups= new SqlDataAdapter("select *from Usergroups", conn);
                    Usergroups.Fill(dt);

                    SqlDataAdapter Groups= new SqlDataAdapter("select *from Groups", conn);
                    Groups.Fill(dt);

                    datagridName.ItemsSource = dt.DefaultView;      

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }