我以前从未使用过包含多个表格的精选查询,现在当我这样做时,我遇到了从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"];
我找不到任何有此类信息的资源,但我知道这是一个基本问题。提前谢谢。
答案 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子句中添加一个你真正感兴趣的字段列表。
如果要在单独的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 JOIN,LEFT OUTER JOIN,RIGHT OUTER JOIN,FULL 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);
}