【问题标题】:Select Data from Database, using Today's Date as criteria从数据库中选择数据,使用今天的日期作为标准
【发布时间】:2014-03-03 15:04:49
【问题描述】:

我正在进行一个 winform C#/SQL 项目, 我在哪里有一个数据表,其中数据存储有相应的时间戳,例如当用户注册投诉时,准确/接近足够的时间戳存储在表中。以“MMM dd yyyy hh:mm:ss”格式存储,表列为“datetime”。

我需要选择表中日期为今天的所有条目... 到目前为止,这是我的代码..

SqlConnection tod1 = new SqlConnection(@"Data Source=2011-GOA-RCC3\SQLEXPRESS;Initial Catalog=IOB_Comm;Integrated Security=True");
tod1.Open();
SqlCommand todc1 = new SqlCommand();
todc1.Connection = tod1;

DateTime today = DateTime.Today;
//DateTime todayl = today.AddDays();
DateTime dnext = today.AddDays(1);
label4.Text = today.ToString("MMM dd yyyy 00:00");
label5.Text = dnext.ToString("MMM dd yyyy 00:00");
label6.Text = label4.Text;
label7.Text = label5.Text;

DateTime d1 = Convert.ToDateTime(label4.Text);
DateTime d2 = Convert.ToDateTime(label5.Text);
dateTimePicker3.Value = today;
dateTimePicker4.Value = dnext;

var d3 = Convert.ToString(label4.Text);
var d4 = Convert.ToString(label5.Text);
//todc.CommandText = "Select * from DCR Where Comp_Date >= '" + d1 + "' And Comp_Date <= '" + d2 + "' Order By Comp_Date Asc";
//todc.CommandText = "Select * from DCR Where Comp_Date '" + DateTime.Today + "'Order by Comp_Date Asc";
todc1.CommandText = "Select * from DCR Where Comp_Date >= '"+ dateTimePicker3.Text +"' And Comp_Date < '"+dateTimePicker4.Text+"' Order By Comp_Date Desc";
int a = todc1.ExecuteNonQuery();
label8.Text = a.ToString();
if (a > 0)
{
    //bind to report viewer
}

但是int a = todc1.ExecuteNonQuery(); 总是返回-1。所以我诊断出我的查询没有正确执行。

我尝试了很多方法,但都没有奏效,更麻烦的是,类似的查询在 SQL 中完美执行。

【问题讨论】:

  • ExecuteNonQuery 总是返回-1,因为你的命令是SELECT。请阅读文档。
  • 好!这个日期(作为字符串)是什么意思:05/03/2014?是3月5日还是5月3日?使用通用的 YYYY-MM-DD。
  • 改用ExecuteReader
  • @SonerGönül O.k.明白了你的意思,那我该如何继续呢?即使我要删除 int a =todc1.execurteNonQuery,选择查询仍然不会返回今天日期范围从例如 2014 年 2 月 28 日 00:00:00 到 2014 年 3 月 1 日...
  • @JohnnyMopp 我有另一种形式,我使用两个 datetimepicker 控件来选择两个独立的日期,比如 2014 年 2 月 25 日和 2014 年 2 月 28 日……该查询将重新运行这两天之间的所有行。我还使用了 executeNonquery 而不是 Execute Reader。它就像一个魅力......

标签: c# sql winforms sql-server-express


【解决方案1】:

您需要从查询中取回一组行,目前您使用的是ExecteNonQuery,它通常用于INSERT/Updates。您还需要参数化您的查询,而不是传递格式化的日期,您可以简化您的代码,例如:

using (SqlConnection conn = new SqlConnection("connectionString"))
{
    using (SqlCommand todc1 = new SqlCommand("Select * from DCR Where Comp_Date >= @todayDate And Comp_Date < @nextDay Order By Comp_Date Desc", conn))
    {
        todc1.Parameters.AddWithValue("@todayDate", DateTime.Today);
        todc1.Parameters.AddWithValue("@nextDay", DateTime.Today.AddDays(1));

        DataTable dt = new DataTable();
        dt.Load(todc1.ExecuteReader());
        //bind to report viewer. 
        //yourReportViewer.DataSource = dt;
    }
}

这将从您的查询中填充DataTable,稍后您可以将其绑定到您的报表查看器。您还应该将ConnectionCommand 对象包含在using statement 中。

【讨论】:

  • 涵盖ExecuteReader 以及处理日期和参数的好答案 - 每个人都应该知道小鲍比桌是谁! :-) xkcd.com/327
  • 在对数据库运行查询之前,AddWithValue 是否将 DateTime 格式化为 MySQL 的 'YYYY-MM-DD' 格式?
  • @DerekW,这就是参数的目的,你不必指定格式。如果您的列类型是DateTime,那就没问题了。但是,您使用的是 MySQL 或 SqlServer,因为您的代码使用 SqlServer 的类,如果您的目标是 MySql 数据库,则使用 MySql 类
  • 好吧,我不是 OP。我只是一个好奇的旁观者。我总是将DateTime 格式化为与RDBMS 一起使用的正确格式,但似乎ADO.NET 中AddWithValue 的功能已经为我做到了。
  • @DerekW,我的错 :),是的,格式化 DateTime 以便通过 .Net 框架(或任何其他) 在 SQL 查询中使用并不是真正的好主意。大多数框架都支持带查询的参数,它们将有助于解决格式问题并从SQL Injection中保存一个@
【解决方案2】:

SqlCommand 方法 ExecuteNonQuery 返回受 INSERT、UPDATE 和 DELETE 命令影响的行数。对于 SELECT 语句,它总是返回 -1。

您应该删除 if (a &gt; 0) 条件,因为这将始终返回 false。

另外,如果您在 GUI 中使用 DateTimePicker 类的对象,您应该使用 Value 属性而不是 Text 属性。

【讨论】:

  • 我认为这不是 OP 所追求的。他们想知道如何使用ExecuteReader 并阅读记录(显示在报告中)。
【解决方案3】:
sqlConnection.Open();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandType = CommandType.Text;
sqlCommand.CommandText = "Select * from DCR Where Comp_Date >= @CurrentDate And Comp_Date < @nextDay Order By Comp_Date Desc";

sqlCommand.Parameters.Add("@CurrentDate", SqlDbType.VarChar).Value = adparam[0];
sqlCommand.Parameters.Add("@NextDate", SqlDbType.VarChar).Value = adparam[1];
sqlCommand.ExecuteNonQuery();

sqlDataAdapter sda = new SqlDataAdapter(sqlcommand);
DataTable dt = new DataTable();
sda.Fill(dt);

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 2020-05-12
    • 2011-08-03
    • 2015-07-23
    • 1970-01-01
    • 2017-06-22
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多