使用INNER JOIN时为空网格

本文关键字:网格 INNER JOIN 使用 | 更新日期: 2023-09-27 18:01:32

我试图得到一个学生的数据,并在c# gridview中显示它。如果我只运行下面的查询,它会从一个名为student的表中得到很好的结果。

conn.Open();
da = new SqlDataAdapter("select sID as 'Student ID',  sFirstName as 'First Name', sLastName as 'Last Name', sGender as 'Gender', sDOB as 'Date Of Birth', sSession as 'Session', sClassRollNo as 'Class Roll Number', sAdmissionDate as 'Admission Date', sGuardianFirstName as 'Guardian First Name', sGuardianLastName as 'Guardian Last Name', sGuardianRelationship as 'Guardian Relationship', sGuardianOccupation as 'Guardian Occupation', sGuardianCity as 'City', sAddress as 'Address', sEmail as 'Email', sMobile as 'Mobile No', sPhone as 'Phone' from student", conn);

当我试图加入学生表与类表和显示数据,它得到我什么都没有,但空网格。

da = new SqlDataAdapter("SELECT student.sID as 'Student ID from Student Table', student.sFirstName as 'Student Name from Student Table', Classes.class as 'Class from Class Table' FROM student INNER JOIN classes ON classes.sID=student.sID", conn);
ds = new System.Data.DataSet();
da.Fill(ds, "student");
gvSearchStudent.DataSource = ds.Tables[0];
conn.Close();

任何想法?

使用INNER JOIN时为空网格

我认为对这个问题的评论很好地回答了这个问题,但我将试着把它们放在一起,并加上我自己的想法,这样这篇文章就有了一个"答案"。

正如user2864740和Eric j提到的,调试这个查询的最好方法是使用SQL Server Management Studio (SSMS)并对查询进行实验,看看底层数据是什么。您已经验证了

SELECT * FROM Student -- I'm using * here as a short cut, 
                      -- you correctly specified the columns you wanted

。这告诉我们,你的连接字符串(很可能)是正确的(即你要去正确的数据库),并且Student表存在。接下来你要做的是

SELECT * FROM Classes

验证Classes表是否存在并包含数据。如果不是,您知道为什么返回0行。

接下来,可视化地扫描您返回的数据—您是否看到Student.sID列中的任何条目与Classes.sID列中的任何条目匹配?同样,如果不是,那么您就知道为什么返回0行了。

让我花一点时间,请您做一个完整性检查。您确定存在Classes.sID列并且它是Student.sID的外键引用吗?这似乎是一个错误,因为这意味着每个类只能有一个学生(除非Classes是一个链接表到其他东西,实际上代表一个类)。

如果到目前为止您遵循了故障排除,并且似乎没有任何故障原因,那么底层数据不应该是问题所在。

看你的评论,

Msg 208, Level 16, State 1, Line 1 .无效对象名称'student'.

我不禁想知道——你确定你没有在什么地方拼错"student"吗?为了防止拼写错误,可以使用表别名,如下所示:

SELECT 
    s.sID as 'Student ID from Student Table', 
    s.sFirstName as 'Student Name from Student Table', 
    c.class as 'Class from Class Table' 
FROM student s
    INNER JOIN classes c ON c.sID=s.sID

如果您仍然有问题,那么考虑剥离查询,使其尽可能基本和语法简单:

SELECT *
FROM student
    INNER JOIN classes ON classes.sID=student.sID

,然后从那里建立