2013-05-09 58 views
1

我有一個關於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。我希望我的查詢查找給定tagID的「當前」sessionID(通過查詢會話的日期和時間,保存在數據庫中),並在Attendance表中顯示TagIDSessionID以及掃描時間。

因此,要實現這一目標,我需要:

  • 再看一下Student表,並獲得TagID
  • 看看哪些當然這tagID相關聯(看着CourseID列)
  • CourseModule表查看與課程相關的模塊
  • 查看ModuleSession表查看哪些會話與模塊關聯
  • Session表檢查其sessionIDAttendance

所以發生「今天和現在的」

  • 顯示tagIDsessionID,如果我想找到的tagID = 4855755當前會話,那麼Attendance輸出應該是:

    出席

    (FK)tagID (FK)sessionID scanningTime 
        4855755 1ACMP2343 
    

    這是因爲:

    • 望着Student表:學生4855755是courseID = 25
    • 望着CourseModule表:CMP2343和CMP3456
    • 看:courseID的兩個模塊= 25層的妥協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)失敗。

  • +3

    只是爲了澄清一切。您的問題即將編寫SQL查詢以從SQL Server數據庫檢索該信息?不是特別的C#.. – gustavodidomenico 2013-05-09 18:39:22

    +0

    [我應該在標題中加入標籤嗎?](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles):不可以。你應該不。 – phadaphunk 2013-05-09 18:40:07

    +0

    你現在的查詢有什麼問題,除了在'FROM'之後刪除第一個'Session se',我不認爲你想要'sessionDate',而是'se.SessionDate'更接近尾聲吧?而且,正如@gustavodidomenico所言,沒有什麼特別與C#相關的這個問題,我不認爲。 – ruffin 2013-05-09 18:49:32

    回答

    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";從同一地點沒有錯誤?

    +0

    對不起,我的... scanTime不是一個外鍵,它只是一個字段 – jaspernorth 2013-05-09 18:59:16

    +0

    哪個表擁有'scanningTime'?從C#代碼看你的SQL,你還有一個額外的'Session se'和'sessionDate'在最後,它應該是'se.SessionDate'。 – ruffin 2013-05-09 19:00:34

    +0

    有沒有辦法輸入這個查詢到你的格式VS?我在Newline中得到了不斷的錯誤... – jaspernorth 2013-05-09 19:01:12

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

    Argh。 [汗!](http://www.utteraccess.com/forum/index.php?s=99a1fee50e2a367b45f35a90ae985647&showtopic=1769126&view=findpost&p=1769143)但我認爲這是因爲連字符;上面的鏈接說如果你沒有「特殊字符」,括號是沒有必要的。那些(例如'CourseID-ModuleID')不是你最初給我們的名字,對吧?你也對我們進行了'LEFT JOIN';有沒有地圖的價值?聽起來很有趣。很高興你有它的工作! – ruffin 2013-05-10 15:02:30