Как мне получить доступ ко всем данным из SQL-запроса, где используется левое соединение? - PullRequest
0 голосов
/ 16 февраля 2011

Я создаю метод, который заполняет некоторые текстовые поля данными, полученными из базы данных Access с использованием табличных адаптеров.

Метод GetCasesWithUserFromCaseId возвращает один случай с username, который обнаруживается путем левого соединения моей таблицы дел с таблицей пользователей.

По какой-то причине я получаю исключение NullReferenceException при попытке доступа к объединенным данным (userdata) из таблицы users, но данные из таблицы case работают. Я уверен, что все поля установлены для всех пользователей и всех дел-таблиц.

Если это не сработает, как я тогда получу данные поочередно? Я приложил изображение, показывающее мою простую базу данных.

sql-оператор:

SELECT *
FROM cases
LEFT JOIN users ON cases.caseCreatedBy = users.userId
WHERE caseId = caseNum

Код C #:

public void populateBoxes(int caseId)
{
   caseDBTableAdapters.casesTableAdapter casesAdapter = 
        new caseDBTableAdapters.casesTableAdapter();
   caseDB.casesDataTable cases;
   cases = casesAdapter.GetCasesWithUserFromCaseId(caseId);

   foreach (caseDB.casesRow casesRow in cases)
   {
      tbCaseName.Text = casesRow.caseName;
      tbOwner.Text = casesRow.usersRow.firstName.ToString();
   }
}

database layout

enter image description here

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Ну, суть в том, что если вы делаете LEFT OUTER JOIN в своей таблице Users, то это утверждение здесь опасно:

foreach (caseDB.casesRow casesRow in cases)
{
    tbCaseName.Text = casesRow.caseName;
    tbOwner.Text = casesRow.usersRow.firstName.ToString();  <== !!!!!
}

С LEFT OUTER JOIN есть вероятность, чтоне являются пользователями для вашего дела - поэтому casesRow.usersRow будет нулевым.

Вы должны проверить это!

foreach (caseDB.casesRow casesRow in cases)
{
    tbCaseName.Text = casesRow.caseName;

    if(casesRow.usersRow != null)
    {
        tbOwner.Text = casesRow.usersRow.firstName.ToString();
    }
}
0 голосов
/ 16 февраля 2011

Вы упомянули, что метод GetCasesWithUserFromCaseId () объединяет таблицы наблюдений и пользователей с левым соединением. Является ли освобождение, которое вы получаете NullReferenceExemption?

Я бы предположил, что вывод вашего метода доступа приведет к

caseName    firstName
----------  ----------
Bildsoe     NULL

если это так, то в строке кода:

tbOwner.Text = casesRow.usersRow.firstName.ToString();

Свойство usersRow для caseRow, вероятно, будет нулевым. Прежде чем пытаться ссылаться на него, вам нужно проверить, является ли свойство нулевым.

...