gpt4 book ai didi

c# - Sql查询按日期搜索数据库

转载 作者:行者123 更新时间:2023-12-02 09:47:31 25 4
gpt4 key购买 nike

有人可以建议我使用 sql 查询来搜索具有特定日期的 ms 数据库吗?

例如,我想搜索 2013 年 2 月 13 日的所有交易。在我的数据库中,我有一个名为“购买日期”的列,用于存储购买日期。

在数据库中,日期以以下格式存储:16/02/2013 02:47:36 AM。

我希望汤姆在文本框中输入我想要的日期,然后将该值传递给查询。

 public DataSet OrderByDate(DateTime date)
{
// string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Amrit\\Desktop\\Database.accdb ;Persist Security Info=False;";
DataSet dataSet = new DataSet();
OleDbConnection oleConn = new OleDbConnection(connString);

try
{
oleConn.Open();
string sql = "SELECT Customer.[Title] + SPACE(2) + Customer.[Customer's Name] as CustomerName, Customer.[Customer's Ebayname], Customer.[Email Address], Customer.[Phone Number], Customer.[Address 1] + SPACE(2) +Customer.[Address 2] + SPACE(2) + Customer.[City] + SPACE(2) + Customer.[Post Code]+ SPACE(2) + Customer.[Country] as Address, Customer.[Item Purchased], Customer.[Purchased Date], Customer.[Total Price] FROM Customer WHERE [Purchased Date]='" + date;
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, oleConn);
dataAdapter.Fill(dataSet, "Customer");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
oleConn.Close();
}
if (dataSet.Tables.Count <= 0)
return null;
else
return dataSet;
}

最佳答案

  1. 始终尝试使用原始/正确的数据类型进行查询。在本例中 - 日期时间。
  2. 切勿将参数连接到 SQL 中 - 尤其是字符串,尤其是当字符串是用户输入时。

以下应该有效:

    public DataSet OrderByDate(DateTime date)
{
string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Amrit\\Desktop\\Database.accdb ;Persist Security Info=False;";
var dataSet = new DataSet();

using(var oleConn = new OleDbConnection(connString))
{
try
{
oleConn.Open();
var cmd = oleConn.CreateCommand();
cmd.CommandText = "SELECT * FROM Customer WHERE [Purchased Date] BETWEEN :dateStart AND :dateEnd";
cmd.Parameters.AddRange(new[]
{
new OleDbParameter("dateStart", date.Date),
new OleDbParameter("dateEnd", date.Date.AddDays(1).AddTicks(-1))
}
);

var dataAdapter = new OleDbDataAdapter(cmd);
dataAdapter.Fill(dataSet, "Customer");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
return dataSet.Tables.Count <= 0 ? null : dataSet;
}

为了清楚起见,我删除了很长的列列表。据我了解,Oracle 期望参数名称前面带有冒号(:),而不是 SQL Server 的“@”。如果上述方法不起作用,请尝试使用 @ 或者仅使用 ?而不是参数名称并提供没有名称的参数。

即使抛出异常,“using”部分也应该很好地处理关闭连接,并且看起来比代码中的finally部分更整洁。

关于这部分:

                    new OleDbParameter("dateStart", date.Date),
new OleDbParameter("dateEnd", date.Date.AddDays(1).AddTicks(-1))

date.Date 仅返回日期部分(时间为 00:00:00),而 date.Date.AddDays(1) 是下一个日期(时间也是 00:00:00),例如 2012-02-16 00:00:00 和 2012-02-17 00:00:00 - 所以正好是 24 小时 - 一天。如果您愿意,可以减去一刻度,但想法仍然相同。这样我们就可以选择日期在该范围内的所有记录(因此使用 BETWEEN)。您可以尝试使用 Oracle 日期时间函数来实现相同的目的,但我相信这更短/更清晰。

关于c# - Sql查询按日期搜索数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14911223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com