如何从使用左连接的SQL查询中访问所有数据?

时间:2011-02-16 15:18:04

标签: c# database tableadapter

我正在创建一个方法,使用表适配器使用从Access数据库检索的数据填充一些文本框。

GetCasesWithUserFromCaseId方法使用username返回单个案例,该案例通过左侧将我的案例表与我的用户表连接起来找到。

由于某种原因,我在尝试从users表访问联接数据(userdata)时遇到NullReferenceException,但来自cases表的数据有效。我确信所有字段都是为所有用户和所有case-tablerows设置的。

如果这不起作用,我该如何交替获取我的数据?我附上了一张显示我简单数据库的图片。

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 个答案:

答案 0 :(得分:1)

嗯,关键是:如果你在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();
    }
}

答案 1 :(得分:0)

您提到GetCasesWithUserFromCaseId()方法正在使用左连接加入案例和用户表。您是否获得了NullReferenceExemption豁免?

我猜你的访问方法的输出结果是

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

如果是这种情况,那么在您的代码行中:

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

casesRow的usersRow属性很可能为null。在尝试引用它之前,您必须检查属性是否为null。