我有一個關於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
表中顯示TagID
和SessionID
以及掃描時間。
因此,要實現這一目標,我需要:
- 再看一下
Student
表,並獲得TagID
- 看看哪些當然這
tagID
相關聯(看着CourseID
列) - 看
CourseModule
表查看與課程相關的模塊 - 查看
ModuleSession
表查看哪些會話與模塊關聯 - 看
Session
表檢查其sessionID
在Attendance
表
所以發生「今天和現在的」
tagID
和sessionID
,如果我想找到的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)失敗。
只是爲了澄清一切。您的問題即將編寫SQL查詢以從SQL Server數據庫檢索該信息?不是特別的C#.. – gustavodidomenico 2013-05-09 18:39:22
[我應該在標題中加入標籤嗎?](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles):不可以。你應該不。 – phadaphunk 2013-05-09 18:40:07
你現在的查詢有什麼問題,除了在'FROM'之後刪除第一個'Session se',我不認爲你想要'sessionDate',而是'se.SessionDate'更接近尾聲吧?而且,正如@gustavodidomenico所言,沒有什麼特別與C#相關的這個問題,我不認爲。 – ruffin 2013-05-09 18:49:32