0

C# プロジェクトでローカルの Access データベースを使用しています。複雑な 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

クエリで、指定された TagID の「現在の」SessionID を検索し (DB に保存されたセッションの日付と時刻を検索して)、TagID と SessionID を出席テーブルにスキャンの時間とともに表示したいと考えています。

次のメソッドを使用して DB との接続をセットアップし、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";

4

1 に答える 1

0

このクエリを機能させることができました。テーブル名の周りに角括弧を追加して解決しました。まず、SESSION ワードは ms-access Jet SQL の予約済みキーワードであるため、その名前を角かっこでカプセル化する必要があります。CourseID-ModuleIDただし、奇妙な点は、テーブルとテーブルの周りにも角括弧を追加する必要があることですModuleID-SessionID。マイナス文字は、MS-Access - 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()";

Access インターフェイスを使用すると、クエリ テキストに角かっこが自動的に追加されるため、エラーはすぐにはわかりません。

補足としてse.SessionData = Date()、現在の日付に等しい SessionDate がないため、結果は効果的に削除されます。

于 2013-05-09T22:23:32.273 に答える