sql 查询中日期的访问数据类型不匹配
Access Data type mismatch of date in sql query
我正在尝试从我的访问数据库中获取在 2 个日期之间订购的订单列表。
这是我的查询:
"SELECT * FROM Orders WHERE OrderDate >= '#" + DateTime.Parse(txtDate.Text) + "#' AND OrderDate <= '#" + DateTime.Parse(txtEndDate.Text) + "#'";
2 个文本框直接从 2 个 ajax 日历扩展器接收日期。我已经确保第一个日期在第二个日期之前,并且我已经确保插入数据库的数据也像'#"+date+"#'一样插入,但我"still data type mismatch in query expression"。
任何人都可以尝试找出我的查询中的问题吗?
假设您有这样的数据:
var txtDate = new { Text = "2020-08-01" };
var txtEndDate = new { Text = "2020-08-01" };
您的查询可能如下所示:
var fromDate = DateTime.ParseExact(txtDate.Text, "yyyy-MM-dd",
CultureInfo.InvariantCulture).ToString("yyyMMdd");
var toDate = DateTime.ParseExact(txtEndDate.Text, "yyyy-MM-dd",
CultureInfo.InvariantCulture).ToString("yyyMMdd");
var query =
$"SELECT * FROM Orders WHERE OrderDate>='{fromDate}' AND OrderDate<='{toDate}'";
或者最后一部分可以是:
var query =
$"SELECT * FROM Orders WHERE OrderDate BETWEEN '{fromDate}' AND '{toDate}'";
日期表达式的分隔符是 octothorpes,而不是 单引号。并且应该强制使用日期值的格式化文本表达式。因此:
"SELECT * FROM Orders WHERE OrderDate >= #" + DateTime.Parse(txtDate.Text).ToString("yyyy'/'MM'/'dd") + "# AND OrderDate <= #" + DateTime.Parse(txtEndDate.Text).ToString("yyyy'/'MM'/'dd") + "#";
就是说,查看如何 运行 使用参数进行查询。它需要更多的代码行,但更容易调试和正确。
为了安全和类型安全,您应该使用参数化查询
Access 数据库查询使用 ?
作为您传递的参数的占位符。
OleDbCommand command = new OleDbCommand();
// I assume you have an oledb connection object and it is in open state
command.Connection = myConnection;
command.CommandText = "SELECT * FROM Orders WHERE OrderDate >= ? AND OrderDate <= ?";
// Please note that the name of the parameters are redundant and not used
command.Parameters.AddWithValue("StartDate", DateTime.Parse(txtDate.Text));
command.Parameters.AddWithValue("EndDate", DateTime.Parse(txtEndDate.Text));
// You can also use your data adatper. This is just an example
command.ExecuteReader();
我正在尝试从我的访问数据库中获取在 2 个日期之间订购的订单列表。 这是我的查询:
"SELECT * FROM Orders WHERE OrderDate >= '#" + DateTime.Parse(txtDate.Text) + "#' AND OrderDate <= '#" + DateTime.Parse(txtEndDate.Text) + "#'";
2 个文本框直接从 2 个 ajax 日历扩展器接收日期。我已经确保第一个日期在第二个日期之前,并且我已经确保插入数据库的数据也像'#"+date+"#'一样插入,但我"still data type mismatch in query expression"。 任何人都可以尝试找出我的查询中的问题吗?
假设您有这样的数据:
var txtDate = new { Text = "2020-08-01" };
var txtEndDate = new { Text = "2020-08-01" };
您的查询可能如下所示:
var fromDate = DateTime.ParseExact(txtDate.Text, "yyyy-MM-dd",
CultureInfo.InvariantCulture).ToString("yyyMMdd");
var toDate = DateTime.ParseExact(txtEndDate.Text, "yyyy-MM-dd",
CultureInfo.InvariantCulture).ToString("yyyMMdd");
var query =
$"SELECT * FROM Orders WHERE OrderDate>='{fromDate}' AND OrderDate<='{toDate}'";
或者最后一部分可以是:
var query =
$"SELECT * FROM Orders WHERE OrderDate BETWEEN '{fromDate}' AND '{toDate}'";
日期表达式的分隔符是 octothorpes,而不是 单引号。并且应该强制使用日期值的格式化文本表达式。因此:
"SELECT * FROM Orders WHERE OrderDate >= #" + DateTime.Parse(txtDate.Text).ToString("yyyy'/'MM'/'dd") + "# AND OrderDate <= #" + DateTime.Parse(txtEndDate.Text).ToString("yyyy'/'MM'/'dd") + "#";
就是说,查看如何 运行 使用参数进行查询。它需要更多的代码行,但更容易调试和正确。
为了安全和类型安全,您应该使用参数化查询
Access 数据库查询使用 ?
作为您传递的参数的占位符。
OleDbCommand command = new OleDbCommand();
// I assume you have an oledb connection object and it is in open state
command.Connection = myConnection;
command.CommandText = "SELECT * FROM Orders WHERE OrderDate >= ? AND OrderDate <= ?";
// Please note that the name of the parameters are redundant and not used
command.Parameters.AddWithValue("StartDate", DateTime.Parse(txtDate.Text));
command.Parameters.AddWithValue("EndDate", DateTime.Parse(txtEndDate.Text));
// You can also use your data adatper. This is just an example
command.ExecuteReader();