0

这是我的第一篇文章,所以请温柔:)

我正在为我的大学项目进行自动注册。我使用 RFID 扫描仪扫描学生 ID 标签和在 Access 中创建的数据库。我使用 C# 和 dataGridView 来显示我的数据库表。

我正在尝试编写一个 SQL 查询,它将通过将保存在数据库中的日期/时间与当前日期/时间相比较,为每个扫描的 tagID 返回一个当前 sessionID。我的问题是:我该怎么做?我用谷歌搜索了我的问题,但找不到我正在寻找的答案(可能是由于我的表格结构复杂)。也许你能帮上忙。

我的表格结构如下:

Student
fields Name -> Data type
=========================
(PK) tagID -> number
studentID -> text
(FK) courseID -> number
studentName -> text

Course
=========================
(PK) courseID -> number
courseName -> text

CourseModule
=========================
(FK) courseID -> number
(FK) moduleID -> text

Module
=========================
(PK) moduleID -> text
courseName -> text

ModuleSession
=========================
(FK) moduleID -> text
(FK) sessionID -> text

Session
=========================
(PK) sessionID -> text
sessionStartDate -> date
sessionTimeStart -> time
sessionTimeEnd -> time

Attendance
=========================
(FK) tagID -> number
(FK) sessionID -> text
(FK) scanningTime -> date/time
4

2 回答 2

0

我不确定你到底想要什么。这是使用 c# 进行的基本数据库查询。

使用 DataAdapters 使用 SQL 查询填充 DataTables。

            using (SqlConnection conn = Connection)
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = @"SELECT *
                                        FROM [Your Tables]
                                        WHERE TagID = @TagID";

                    cmd.Parameters.Add(new SqlParameter("@TagID", SqlDbType.UniqueIdentifier) { Value = variableName});

                    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                    {
                        DataSet dataSet = new DataSet();
                        adapter.Fill(dataSet, "datatablename");

                        return dataSet.Tables["datatablename"];
                    }
                }
            }

然后,您可以通过循环或使用 Lambda 函数从 DataTable 中获取值

或者您可以使用 GridView 属性将 DataTable 绑定到 GridView

我不确定你想用 DataTable 做什么。

于 2013-05-08T15:29:07.207 回答
0

如果可能,请将您的会话开始和结束时间更改为完整的日期时间,因为使用 3 个字段来指定开始/结束时间段会使查询变得非常复杂。如果您引入此更改,并且我已正确理解您想要的内容,则此查询将返回您需要的结果:

SELECT s.sessionID
FROM Attendance a
  INNER JOIN Session s ON a.sessionID = s.sessionID
WHERE a.scanningTime BETWEEN s.sessionTimeStart AND s.sessionTimeEnd 

如果您不想更改字段,那么您需要构造一个可以在查询中使用的开始和结束日期时间

编辑经过一番检查,带有 DATEADD 的查询将不起作用。如果您仍想使用 3 个字段,这应该有效:

WHERE a.scanningTime BETWEEN (s.sessionStartDate + s.sessionTimeStart) AND (s.sessionStartDate + s.sessionTimeEnd)

但是有一个条件: sessionStartDate 列的 Time 部分始终为零。
您可以通过为您的字段使用“日期”SQL 类型来强制执行此操作(仅适用于 Sql server 2008 或更高版本)

请注意,我直接输入了查询,我没有测试语法是否完全正确。

于 2013-05-08T15:31:09.683 回答