1

我有一个关于我想实现的 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和以及扫描时间。SessionIDAttendance

所以要实现这一点,我需要:

  • 看看什么Student表,得到TagID
  • 查看这与哪个课程tagID相关(查看CourseID列)
  • 查看CourseModule表格以查看与课程相关的模块
  • 查看ModuleSession表格以查看与模块关联的会话
  • 查看Session表格以检查sessionID“今天和现在”发生的情况
  • 显示tagIDsessionIDAttendance表格中

因此,如果我想找到 的当前会话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 )。

4

2 回答 2

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()";

请注意,您的 SQLSession se在同一行中有一个额外的,FROM Student s并且有s.SessionDate而不是se.SessionDate.

尝试爆破第二条 SQL 中的注释;自从我在 Access 中抛出 SQL 以来已经有很长时间了。

过去,您可能正在转向另一个问题。试试标准的调试动作——你能运行一个更简单的查询吗,比如query = "SELECT * FROM Student";从同一个地方没有错误?

于 2013-05-09T18:53:31.147 回答
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()";
于 2013-05-10T11:51:51.197 回答