2013-05-09 3 views
0

Я использую базу данных локального доступа в проекте C#. Мне нужно разработать сложный SQL-запрос, но я немного застрял. Моя структура таблицы:запрос базы данных в визуальной студии

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 

Я хотел бы мой запрос, чтобы найти «текущий» SessionID (путем поиска даты и времени сеанса, сохраненную в БД) для данного TagID и отображения TagID и SessionID в таблице посещаемости, а также время сканирования.

Я использую метод folowing для установки соединения с БД, а также отображать данные в dataGridView2:

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

     } 

Когда я выполняю код выше, я получаю сообщение об ошибке:

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. Попробуйте добавить дату, как у вас, для времени сканирования (просто без временной части) – Greg

+0

Не работает, я уверен, что Date() является функцией SQL ... – jaspernorth

+0

Какой сервер баз данных вы используете? – Greg

ответ

0

Мне удалось разрешить этот запрос. Я решил добавить квадратные скобки вокруг имен таблиц. Во-первых, слово SESSION является зарезервированным ключевым словом в ms-access jet SQL, поэтому вам нужно инкапсулировать это имя в квадратных скобках. Однако странная часть состоит в том, что вам нужно добавить квадратные скобки и вокруг таблиц CourseID-ModuleID и ModuleID-SessionID. Символ минус не очень хорошо принят MS-Access - OleDb двигатель, Infact, если вы попытаетесь простой "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()"; 

Использование Access интерфейс квадратная скобка автоматически добавляется в текст запроса, и поэтому ошибка не отображается сразу.

В качестве примечания стороны, что se.SessionData = Date() эффективно удаляет любой результат, потому что SessionDate не равен текущей дате.

+0

dosn't вообще: /, все равно получите ту же ошибку – jaspernorth

+0

Мне любопытно об этой ошибке. У вас есть запасной db для публикации на каком-то сайте обмена файлами? – Steve

+0

жаль нет, но я рад отправить его вам. Не могли бы вы выслать мне адрес электронной почты как prv msg? – jaspernorth

Смежные вопросы