我有一个关于C#中的SQL的问题我想实现但是我有点卡住了。以下是包含一些示例数据的表格:
学生:
(PK)tagID studentID (FK)courseID
4855755 HUJ564334 25
4534664 RED231232 33
课程
(PK)courseID courseName
25 Computer Science
33 Biology
CourseModule
(FK)courseID (FK)moduleID
25 CMP2343
25 CMP3456
33 BIO3422
33 BIO2217
模块
(PK)moduleID moduleName
CMP2343 Networking
CMP3456 Databases
BIO3422 Human body
BIO2217 Genetics
ModuleSession
(FK)moduleID (FK)sessionID
CMP2343 1ACMP2343
CMP2343 2ACMP2343
CMP3456 1ACMP3456
CMP3456 2ACMP3456
BIO3422 1ABIO3422
BIO3422 2ABIO3422
BIO2217 1ABIO2217
BIO2217 2ABIO2217
会话
(PK)sessionID sessionStartDate sessionTimeStart sessionTimeEnd
1ACMP2343 09/05/2013 12:00 AM 14:00 PM
2ACMP2343 05/05/2013 09:00 AM 11:00 PM
1ACMP3456 15/05/2013 12:00 AM 13:00 PM
2ACMP3456 01/05/2013 10:00 AM 13:00 PM
1ABIO3422 30/04/2013 11:00 AM 13:00 PM
2ABIO3422 01/04/2013 14:00 AM 16:00 PM
1ABIO2217 12/05/2013 16:00 AM 18:00 PM
2ABIO2217 03/05/2013 12:00 AM 14:00 PM
考勤
(FK)tagID (FK)sessionID scanningTime
我正在使用RFID扫描仪扫描学生tagID
。我希望我的查询能够找到给定sessionID
的“当前”tagID
(通过查找会话的日期和时间,保存在数据库中),并显示TagID
和{ SessionID
表格中的{1}}以及扫描时间。
为实现这一点,我需要:
Attendance
表格并获取Student
TagID
与哪个相关的课程(查看tagID
列)CourseID
表,了解与课程相关的模块CourseModule
表以查看与模块关联的会话ModuleSession
表,查看今天发生了哪个Session
现在“sessionID
表格tagID
和sessionID
因此,如果我想查找Attendance
的当前会话,则tagID = 4855755
输出应为:
考勤:
Attendance
这是因为:
(FK)tagID (FK)sessionID scanningTime
4855755 1ACMP2343
表:学生4855755在课程ID = 25 Student
表:courseID = 25个两个模块的妥协:CMP2343和CMP3456 CourseModule
表:模块CMP2343和CMP3456每个2个会话的危害:1ACMP2343; 2ACMP2343和1ACMP3456; 2ACMP3456 ModuleSession
表:今天只有会议1ACMP2343正在进行我的问题是如何编写查询以便能够实现上述示例?我已经开始查询,但我需要一些帮助才能使它按原样运行。
代码是:
Session
(更新)我班的C#代码是:
SELECT Student.tagID, Session.sessionID
FROM Student s , Session se
INNER JOIN Course c ON c.courseID = s.courseID
INNER JOIN CourseModule cm ON cm.courseID = c.courseID
INNER JOIN Module m ON m.moduleID = cm.moduleID
INNER JOIN ModuleSession ms ON ms.moduleID = cm.moduleID
INNER JOIN Session se ON se.sessionID = ms.sessionID
INNER JOIN Attendance a ON a.sessionID = se.sessionID
WHERE Student.tagID = 4820427
AND s.SessionDate=DATE();
我已经更新了我的SQL代码,但仍然无法让它运行,我得到并且错误: System.Data.dll中发生了未处理的“System.Data.OleDb.OleDbException”类型异常 其他信息:IErrorInfo.GetDescription因E_FAIL(0x80004005)而失败。
答案 0 :(得分:1)
为了使您的C#更易于阅读,您可能希望使用“@”约定来插入换行符。我要为第三个字段作弊 - 我想你希望输出是你运行查询的时间。
query = @"SELECT s.tagID, se.sessionID, " +
"'" + DateTime.Now.ToString("MM/dd/yy HH:mm:ss tt") + @"' AS scanningTime
FROM Student s
INNER JOIN Course c ON c.courseID = s.courseID
INNER JOIN CourseModule cm ON cm.courseID = c.courseID
INNER JOIN Module m ON m.moduleID = cm.moduleID
INNER JOIN ModuleSession ms ON ms.moduleID = cm.moduleID
INNER JOIN Session se ON se.sessionID = ms.sessionID
INNER JOIN Attendance a ON a.sessionID = se.sessionID
WHERE Student.tagID = 4820427
AND se.SessionDate=DATE()";
我认为实际上有几种方法可以清理它。你需要课程的任何价值吗?如果没有,请删除该连接。与模块和模块会话相同。
query = @"select s.tagID, ms.sessionId, " +
"'" + DateTime.Now.ToString("MM/dd/yy HH:mm:ss tt") + @"' AS scanningTime
from student s,
coursemodule cm,
modulesession ms,
session sess
WHERE 1=1
and s.tagID = 4820427
and s.courseId = cm.courseId
and ms.moduleId = cm.moduleId
and ms.sessionId = sess.sessionId
and sess.sessionStartDate = Date()";
请注意,您的SQL在与Session se
相同的行中有一个额外的FROM Student s
,并且s.SessionDate
代替se.SessionDate
。
尝试在第二个SQL中爆破注释;自从我在Access上抛出SQL以来,已经有很长一段时间了。
过去,你可能会转向另一个问题。尝试标准的调试动作 - 你可以从同一个地点运行一个更简单的查询,比如query = "SELECT * FROM Student";
而没有错误吗?
答案 1 :(得分:0)
我设法让这个查询工作。它需要围绕表名的方括号。
string query = @"SELECT s.TagID, se.SessionID, '" +
DateTime.Now.ToString("MM/dd/yy HH:mm:ss tt") +
"' AS scanningTime " +
"FROM (((Student s " +
" LEFT JOIN [CourseID-ModuleID] cm ON s.CourseID = cm.CourseID) " +
" LEFT JOIN [ModuleID-SessionID] ms ON ms.ModuleID = cm.ModuleID) " +
" LEFT JOIN [Session] se ON ms.SessionID = se.SessionID) " +
"WHERE s.TagID = 4820427 AND se.SessionDate = Date()";