C# 访问多个表的SQL查询

C# 访问多个表的SQL查询,c#,sql,.net,sql-server,crystal-reports,C#,Sql,.net,Sql Server,Crystal Reports,如果只显示单个表中的结果,效果很好 SqlCeCommand command = new SqlCeCommand("SELECT Student.EnrolNo,Student.St_Name FROM Student", ceConnection); SqlCeDataAdapter adapter = new SqlCeDataAdapter(command); DataSet set = new DataSet(); adapter.Fill(set, "Student"); Rep

如果只显示单个表中的结果,效果很好

SqlCeCommand command = new SqlCeCommand("SELECT Student.EnrolNo,Student.St_Name FROM Student", ceConnection);

SqlCeDataAdapter adapter = new SqlCeDataAdapter(command);
DataSet set = new DataSet();
adapter.Fill(set, "Student");

ReportDocument document = new ReportDocument();
document.Load(@"C:\Users\user\documents\visual studio 2012\Projects\Student_Scholarship_management2\Student_Scholarship_management2\MainReport.rpt");
document.SetDataSource(set.Tables[0]);

crystalReportViewer1.ReportSource = document;
现在,上面的代码运行良好,因为它只引用了一个表,但是如果我使用下面的查询,它将访问来自多个表的记录

SqlCeCommand command = new SqlCeCommand("SELECT Student.EnrolNo,Student.St_Name,Campus.C_ID FROM Student INNER JOIN Campus ON Student.Campus_ID=Campus.C_ID", ceConnection);
仅显示来自学生表的列。我尝试过通过DatabaseExpert导入和链接更多的表,但没有用。我已经验证了这个查询,结果很好,只是没有显示在crystal reports中

我在DatabaseExpert中添加了表,并在报表设计器中添加了相关列。不幸的是,它只显示一个表中的数据。什么原因可能导致这种情况?

当您呼叫:

adapter.Fill(set, "Student");
此时,dataset中的表模式被构建。因此,如果在下面填充其他列,则只会考虑第一次填充的列。您的解决方案是替换:

SqlCeCommand command = new SqlCeCommand("SELECT Student.EnrolNo,Student.St_Name FROM Student", ceConnection);


我想看看你的set命令:

document.SetDataSource(set.Tables[0]);
在我看来,这似乎只是在设置数据集中的第一个表

我正在开发的应用程序中也有类似的情况,这是我的代码(正在传入大约10个表):


最后一行将报表的数据源设置为数据集中的所有表

您希望显示校园中的哪些栏目?您的
SELECT
语句仅引用学生表列和Campus.C_ID,后者与Student.Campus_ID相同-出现在两个表中。您没有特别从校园表中选择任何列。我只想显示校园表中的C_ID,因为我说查询没有问题,我已经验证了查询结果,它们显示正确。如果是这样,问题在于报表本身,可能您没有引用报表中的新列,或者报表已缓存/未刷新数据。如果SQL正在运行,并且您看到了所有3列,那么我将查看实际的报告定义。我不使用Crystal Reports,但您可能需要在报表设计器(或定义等)中显式添加新列。是的,问题恰恰在于报表。我在DatabaseExpert中添加了表,并在报表设计器中添加了相关列。不幸的是,它只显示一个表中的数据,我不知道为什么?但我没有使用
SqlCeCommand命令=newsqlcecommand(“SELECT Student.EnrolNo,Student.St_Name from Student”,ceConnection)
首先,我要显示的sql是
SqlCeCommand命令=new SqlCeCommand(“选择Student.EnrolNo,Student.St_Name,Campus.C_ID FROM Student internal JOIN Campus ON Student.Campus_ID=Campus.C_ID”,ceConnection)
document.SetDataSource(set.Tables[0]);
var data = new DataSet();

//Do stuff to populate the dataset

report.SetDataSource(data);