C# 使用内部联接时为空网格

C# 使用内部联接时为空网格,c#,sql,join,datagridview,C#,Sql,Join,Datagridview,我试图获取一个学生的数据,并将其显示在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 '

我试图获取一个学生的数据,并将其显示在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();

有什么想法吗?

我认为关于这个问题的评论很好地回答了这个问题,但我会尝试将它们汇集在一起,并添加我自己的想法,以便这篇文章有一个答案

正如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
工作。这告诉我们,您的连接字符串很可能是正确的,即您要访问正确的数据库,并且学生表存在。你应该做的下一件事是

SELECT * FROM Classes
验证Classes表是否存在并包含数据。如果没有,您知道为什么要返回0行

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

让我花点时间让你做一个精神检查。是否确实存在Classes.sID列,并且该列是对Student.sID的外键引用?这似乎是一个错误,因为这意味着每个类只能有一个学生,除非类是一个链接表,指向实际代表一个类的其他对象

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

看你的评论,


Msg 208,16级,状态1,第1行无效的对象名称“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

然后从那里建立它。

如果它返回一个空网格,那么很可能有0个连接匹配项。在SSMS中尝试相同的查询。如果在SSMS中运行该查询,您会得到一些信息吗?如果看不到底层数据,就不可能知道您得到的结果是否正确。Msg 208,16级,状态1,第1行无效的对象名称“student”。当我在Ms SQL中运行SELECT student.sID、student.sFirstName、classes.classes FROM student internal JOIN classes ON student.sID=classes.sID时,它给出了这个结果。抱歉,我是新来的。我不熟悉连接到数据库和从c运行sql,但你确定学生作为表存在于你连接到的任何数据库中吗?@user3615189你有没有弄明白这一点,这里的任何注释/答案对你有帮助?