2013-05-09 3 views
0

C# 프로젝트에서 로컬 Access 데이터베이스를 사용합니다. 복잡한 SQL 쿼리를 개발할 필요가 있지만 조금 갇혀 있습니다. 내 테이블 구조는 다음과 같습니다 내 쿼리를 싶습니다 Visual Studio에서 데이터베이스 쿼리하기

Student: 
(PK)TagID StudentID (FK)CourseID 
4855755 HUJ564334 25 
4534664 RED231232 33 

Course 
(PK)CourseID CourseName 
25   Computer Science 
33   Biology 

CourseID-ModuleID 
(FK)CourseID (FK)ModuleID 
25    CMP2343 
25    CMP3456 
33    BIO3422 
33    BIO2217 

Module 
(PK)ModuleID ModuleName 
CMP2343  Networking 
CMP3456  Databases 
BIO3422  Human body 
BIO2217  Genetics 

ModuleID-SessionID 
(FK)ModuleID (FK)SessionID 
CMP2343  1ACMP2343 
CMP2343  2ACMP2343 
CMP3456  1ACMP3456 
CMP3456  2ACMP3456 
BIO3422  1ABIO3422  
BIO3422  2ABIO3422 
BIO2217  1ABIO2217  
BIO2217  2ABIO2217 

Session 
(PK)SessionID SessionDate  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 

Attendance 
(FK)TagID (FK)SessionID ScanningTime 

을 찾기 위해 "현재"세션 ID TagID 및 세션 ID를 부여 TagID에 대한, 그리고 표시 (DB에 저장된 세션의 날짜와 시간을 찾고에 의해) Attendance (출석) 테이블에서 스캔 시간을 확인합니다.

난 dataGridView2의 데이터를 DB와 연결을 설정하고 표시하는 folowing 방법을 사용 I 위의 코드를 실행할 때

public void setSQL() 
     { 
      string ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\jasper\\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(); 

     } 

, I 얻을 오류 :

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll 
Additional information: IErrorInfo.GetDescription failed with E_FAIL(0x80004005). 

다음과 같은 간단한 쿼리를 실행하고 표시 할 수 있으므로 메서드 구조가 정상적으로 작동합니다. "SELECT * FROM Student";

+0

당신이 가진 문제는'se.SessionDate = Date();'라고 생각합니다. 나는 Date()가 SQL 함수라고 생각하지 않는다. (시간 부분 만 제외하고) 스캔 시간과 같이 datetime을 추가하십시오. – Greg

+0

작동하지 않습니다. Date()가 SQL 함수임을 확신합니다 ... – jaspernorth

+0

어떤 데이터베이스 서버를 사용하고 있습니까? – Greg

답변

0

이 쿼리가 작동하도록 관리했습니다. 테이블 이름 주위에 대괄호를 추가하여 해결했습니다. 첫째, SESSION 단어는 ms 액세스 제트 SQL에서 예약 된 키워드이므로 대괄호 안에 해당 이름을 캡슐화해야합니다. 그러나 이상한 부분은 CourseID-ModuleIDModuleID-SessionID 테이블 주위에 대괄호를 추가해야한다는 것입니다. 마이너스 문자는 잘 MS-액세스에 의해 허용되지 않는다 -은 OleDb 엔진 가리키고 당신은 간단한 "SELECT * FROM CourseID-ModuleID" 당신이 액세스를 사용하여 테이블 이름

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

주위에 대괄호를 넣으면 사라 구문 오류가 시도하는 경우 대괄호가 자동으로 쿼리 텍스트에 추가되므로 오류가 즉시 표시되지 않습니다.

부수적으로, se.SessionData = Date()은 현재 날짜와 동일한 SessionDate가 없기 때문에 결과를 효과적으로 제거합니다.

+0

전혀 작동하지 않습니다 : /, 여전히 동일한 오류가 발생 – jaspernorth

+0

이 오류에 대해 궁금합니다. 파일 공유 사이트에 게시 할 여분의 DB가 있습니까? – Steve

+0

죄송합니다. 이메일을 보내 드리겠습니다. prv 메시지로 이메일을 보내 주시겠습니까? – jaspernorth

관련 문제