【问题标题】:How to access values stored in a dataset in VB?如何访问存储在 VB 数据集中的值?
【发布时间】:2012-03-08 12:01:37
【问题描述】:

所以我有一个包含 3 个表的数据库。 User 带有U_IDU_Name 的表,Class 带有C_IDC_NameUser_Class 带有U_ID 的表和C_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 是因为我可以像上面一样访问存储在每个单元格中的值。

我一定缺少一种从这三个简单表中检索所需信息的简单方法。

感谢任何帮助,谢谢

【问题讨论】:

    标签: sql database vb.net dataset


    【解决方案1】:

    如果你最终是基于用户登录使用这个,如果有一些共同点,为什么不在三个表上做一个连接并返回请求的字段。

    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 并输出每一行(如果您正在尝试使用它)。

    【讨论】:

      【解决方案2】:

      与之前的答案一样,我建议使用单个 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】:

        我最喜欢的是:

        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
        

        【讨论】:

          【解决方案4】:

          你看过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 中没有唯一约束,因此使用子查询,因为这消除了对 DISTINCT 的需要或GROUP BY,这样会优化得更好。但是,如果 U_ID 和 C_ID 在 User_Class 中受到唯一约束,那么根据您的 RDBMS 使用联接可能会有所帮助。 SQL-Server 将以几乎完全相同的方式优化两者:

          总的来说,SQL 方法可能是有益的,但您应该使用的确切 SQL 取决于您的 RDBMS、数据结构、索引和键。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-22
            • 1970-01-01
            • 2021-11-07
            • 2020-12-03
            • 2011-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多