【发布时间】:2021-03-24 14:50:08
【问题描述】:
我有一个数据网格视图,其中包含一些学生的信息,我想过滤数据以仅显示出生日期大于 datetimePicker1 且小于 datetimePicker2 的学生,这些学生是之前在我的表单中创建的。这是我的代码应用 SqlDataAdapter 但它根本不起作用:
SqlDataAdapter adap = new SqlDataAdapter("select * from Student where bdate >= '" + dateTimePicker1.Value + "' and bdate <= '" + dateTimePicker2.Value + "' ", mydb.getConnection);
DataTable table = new DataTable();
adap.Fill(table);
dataGridViewStudentList.DataSource = table;
*bdate 是我数据库中的一列,其中包含日期时间类型的学生的生日。 任何人都可以提供帮助,非常感谢。
【问题讨论】:
-
您忘记提及
bdate列的数据类型是什么。您将其视为字符串。是吗?在这种情况下,请更改为日期。 -
始终使用参数化 sql 并避免字符串连接向 sql 语句添加值。这可以缓解 SQL 注入漏洞并确保将值正确传递给语句。请参阅 How can I add user-supplied input to an SQL statement? 和 Exploits of a Mom。使用
DateTime可能不会构成注入威胁,但由于实例在连接期间如何转换为字符串,它仍然可能导致问题。 -
bdate 的类型是 Datetime 并且它不起作用,即使我在 sql 中使用 cast 函数将 datetimepicker1.value 转换为 Datetime 它仍然不起作用
-
DateTimePicker1.Value(正如控件的名称所暗示的)已经属于 DateTime 类型。您需要使用命令参数将值传递给查询(使用[Command].Parameters.Add(),而不是[Command].Parameters.AddWithValue())。 -
非常感谢@Jimi 它有效