如何在VB中访问存储在数据集中的值?

时间:2012-02-17 03:00:30

标签: sql database vb.net dataset

所以我有一个包含3个表的数据库。 用户包含U_IDU_Name C_IDC_Name User_Class 包含U_IDC_ID的表格。外键已设置。

我想显示与所选用户关联的类。用户通过其姓名进行标识。我知道这些是我需要执行的两个SQL语句:

SELECT U_ID FROM User WHERE U_Name = current_U_name

然后

SELECT C_ID FROM User_Class WHERE U_ID = current_U_ID

然后

SELECT C_Name FROM Class WHERE C_ID = C_IDforAllMatchingRows

我想使用数据集来存储每个语句的结果,但我无法弄清楚如何访问数据集中的一个值,即

(SELECT C_ID FROM User_Class WHERE U_ID = *dataset.Tables(0).Column(0)*) - 无效

我开始使用gridviews,因为我可以像上面那样访问存储在每个单元格中的值。

我必须错过一种从这三个简单表中检索所需信息的简单方法。

感谢任何帮助,谢谢

4 个答案:

答案 0 :(得分:0)

如果您最终根据登录的用户使用此功能,为什么不在三个表上进行连接(如果存在某些共性)并返回请求的字段。

SELECT C_NAME 
FROM CLASS AS A
INNER JOIN
(
    SELECT C_ID
    FROM
    USER_CLASS AS B 
    INNER JOIN
    USER AS C
    ON 
        B.U_ID = C.U_ID
    WHERE 
        U_Name = current_U_name
 ) AS D
 ON 
    A.C_ID = D.C_ID

根据我对你的问题的理解,对于学生来说,你似乎想要返回一个类列表,这个查询应该做什么。如果将它存储在数据表中,您可以使用linq或a for each并输出每一行,如果这是您尝试使用它。

答案 1 :(得分:0)

你看过DataTable.Select()方法了吗?这有点长,但如果所有数据都已经在数据集中,你可以使用类似的东西:

    Dim userRows As DataRow() = DataSet.Tables("User").Select(String.Format("WHERE U_Name = '{0}'", Current_User))
    If (userRows.Length = 0) Then
        Throw New Exception("User Not Found")
    End If

    Dim UID As Int32 = Convert.ToInt32(userRows(0).Item(0))
    Dim userClassRows As DataRow() = DataSet.Tables("User_Class").Select(String.Format("WHERE U_ID = {0}", UID))

    If (userClassRows.Length = 0) Then
        Throw New Exception("User Not Found")
    End If

    Dim classRows As New List(Of DataRow)
    For i As Int32 = 0 To userClassRows.Length - 1
        classRows.AddRange(DataSet.Tables("Class").Select(String.Format("WHERE C_ID = {0}", classRows(i).Item("C_ID"))))
    Next

    YourGridView.DataSource = classRows

(我主要使用C#,所以请原谅我的VB中的任何错误/失礼。希望仍然可以遵循逻辑。)

虽然像前面的回答一样,我会使用SQL方法,除非有充分的理由不直接从数据库中为每个用户检索类:

SELECT  *
FROM    Class
WHERE   C_ID IN 
        (   SELECT  C_ID 
            FROM    User_Class 
            WHERE   U_ID IN (SELECT U_ID FROM user WHERE U_Name = @CurrentUser)
        )

<强>附录

@Aprillion已经提出了关于连接可能更快的一个好点,这大部分都是正确的,我假设C_ID和U_ID在User_Class表中没有唯一的限制,因此去了子查询,因为这消除了{{1 }或DISTINCT,因此会更好地优化。但是,如果U_ID和C_ID在User_Class中受到唯一约束,那么根据您的RDBMS使用连接可能是有益的。 SQL-Server将以几乎完全相同的方式优化两者:

Execution Plan in SQL Server

总之,SQL方法可能是有益的,但您应该使用的确切SQL将取决于您的RDBMS,数据结构,指标和密钥。

答案 2 :(得分:0)

与之前的答案一样,我建议使用单个SQL查询来检索“与所选用户关联的类” - 但是joins should be faster than subqueries

query = "select c.c_name" & _
        " from user u" & _ 
        " join user_class uc on u.u_id = uc.u_id" & _ 
        " join class c on uc.c_id = c.c_id" & _ 
        " where u.u_name = '" & current_U_name & "'"

答案 3 :(得分:0)

我最喜欢的是:

query = "select c.c_name from user u, user_class uc, class c 
  where u.u_name = '" & current_U_name & "'" 
  and u.u_id = uc.u_id and uc.c_id = c.c_id