Как получить доступ к значениям, хранящимся в наборе данных в VB? - PullRequest
0 голосов
/ 17 февраля 2012

Итак, у меня есть БД с 3 таблицами. Пользователь Таблица с U_ID и U_Name, Класс с C_ID, C_Name и User_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

1021 * тогда *

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 голосов
/ 21 февраля 2012

Мой любимый это:

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
0 голосов
/ 17 февраля 2012

Вы смотрели на 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 #, поэтому, пожалуйста, извините за любые ошибки / ошибки в моемВ.Б. Надеюсь, что за логикой все еще можно следовать).

Хотя Как и в предыдущем ответе, я бы использовал подход 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)
        )

ADDENDUM

@ Aprillion поднял хороший вопрос о том, что соединения, вероятно, быстрее, что в основном верно, я предположил, что C_ID и U_ID не являютсяоднозначно запрещено в таблице User_Class, поэтому используется для подзапросов, поскольку это устраняет необходимость в DISTINCT или GROUP BY и, как таковое, оптимизирует лучше.Однако, если U_ID и C_ID уникально ограничены в User_Class, тогда может быть полезно использовать объединения в зависимости от вашей РСУБД.SQL-Server оптимизирует оба метода практически одинаково:

Execution Plan in SQL Server

В целом, подход SQL, вероятно, полезен, но точный SQL, который вы должны использовать, будет зависеть от вашей RDBMS,структуры данных, индикаторы и ключи.

0 голосов
/ 17 февраля 2012

Как и в предыдущих ответах, я рекомендую один SQL-запрос для получения «классов, связанных с выбранным пользователем», но объединения должны выполняться быстрее, чем подзапросы :

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 & "'"
0 голосов
/ 17 февраля 2012

Если вы в конечном итоге используете это на основании того, что пользователь вошел в систему, почему бы не выполнить объединение трех таблиц, если есть некоторая общность и вернуть запрошенные поля.

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 для каждой и выводить каждую строку, если это то, что вы пытаетесь сделать с ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...