我有一个关于我想实现的 C# 中的 SQL 的问题,但我有点卡住了。以下是包含一些示例数据的表格:
学生:
(PK)tagID studentID (FK)courseID
4855755 HUJ564334 25
4534664 RED231232 33
课程
(PK)courseID courseName
25 Computer Science
33 Biology
课程模块
(FK)courseID (FK)moduleID
25 CMP2343
25 CMP3456
33 BIO3422
33 BIO2217
模块
(PK)moduleID moduleName
CMP2343 Networking
CMP3456 Databases
BIO3422 Human body
BIO2217 Genetics
模块会话
(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
Attendance
所以要实现这一点,我需要:
- 看看什么
Student
表,得到TagID
- 查看这与哪个课程
tagID
相关(查看CourseID
列) - 查看
CourseModule
表格以查看与课程相关的模块 - 查看
ModuleSession
表格以查看与模块关联的会话 - 查看
Session
表格以检查sessionID
“今天和现在”发生的情况 - 显示
tagID
和sessionID
在Attendance
表格中
因此,如果我想找到 的当前会话tagID = 4855755
,那么Attendance
输出应该是:
出席:
(FK)tagID (FK)sessionID scanningTime
4855755 1ACMP2343
这是因为:
- 看
Student
表:学生 4855755 在 courseID = 25 上 - 看
CourseModule
表: courseID = 25 两个模块的妥协:CMP2343 和 CMP3456 - 看
ModuleSession
表:模块 CMP2343 和 CMP3456 各折衷 2 个会话:1ACMP2343;2ACMP2343 和 1ACMP3456;2ACMP3456 - 看
Session
表:今天和现在只进行会话 1ACMP2343
我的问题是如何编写查询以实现上述示例?我已经开始查询,但我需要一些帮助才能使其正常工作。
代码是:
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();
(更新)我班的 C# 代码是:
public void setSQL()
{
string ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Kacper\\Desktop\\AutoReg\\AutoReg\\AutoReg.accdb;";`
OleDbConnection MyConn = new OleDbConnection(ConnStr);
MyConn.Open();
DataSet ds = new DataSet();
//query to ask
string query = @"SELECT s.TagID, se.SessionID, " + "'" +
DateTime.Now.ToString("MM/dd/yy HH:mm:ss tt") + @"' AS scanningTime
FROM Student s,
CourseID-ModuleID cm,
ModuleID-SessionID ms,
Session se
WHERE 1=1
AND s.TagID = 4820427
AND s.CourseID = cm.CourseID
AND ms.ModuleID = cm.ModuleID
AND ms.SessionID = se.SessionID
AND se.SessionDate = Date();";
OleDbCommand command = new OleDbCommand(query, MyConn);
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
adapter.Fill(ds);
dataGridView2.DataSource = ds.Tables[0];
MyConn.Close();
}
我已经更新了我的 SQL 代码,但仍然无法运行它,我得到了错误:System.Data.dll 中发生了“System.Data.OleDb.OleDbException”类型的未处理异常附加信息:IErrorInfo.GetDescription 失败并显示 E_FAIL(0x80004005 )。