【问题标题】:Counting a specific number of records using MySqlDataReader使用 MySqlDataReader 计算特定数量的记录
【发布时间】:2013-05-15 10:40:47
【问题描述】:

我有这段代码可以计算具有相同年份和日期的记录数。但是当我运行应用程序时它不起作用。这是我的代码:

try
{
    string query = "SELECT * FROM tblOrder WHERE dateTime_coded=@dateTimeNow";

    MySqlCommand cmd = new MySqlCommand(query, con);
    cmd.Parameters.AddWithValue("@dateTimeNow", Convert.ToDateTime(DateTime.Now).ToString("yyyy-MM"));

    MySqlDataReader dr = cmd.ExecuteReader();

    MessageBox.Show("OK");
    con.Open();

    while (dr.Read())
    {
        count++;
    }

    dr.Close();
    con.Close();
}
catch (Exception)
{

}

【问题讨论】:

  • Offtopic DateTime.Now 已经是 DateTime 你不需要 Convert 部分
  • 你能解释一下你是如何推断出当我运行应用程序时它不起作用部分
  • 什么不起作用?不要编写一个空的 catch 块来隐藏异常而没有任何警告或消息让你知道你的代码有什么问题
  • @V4Vendetta 我试图有一个消息框来显示con.Close 行之后的计数但它没有显示所以我推断它不起作用。
  • @Steve 那么我将如何处理捕获的内容?

标签: c# mysql winforms mysqldatareader


【解决方案1】:

首先你有一个没有意义的空 catch 块

至少这样会更好

catch (Exception ex)
{
     MessageBox(ex.Message);// you would know if in case it failed
}

现在问题似乎是

MySqlDataReader dr = cmd.ExecuteReader();

MessageBox.Show("OK");
con.Open(); <--- opening after executing the reader ! 

您应该尝试将连接放在 using 块中

using(MySqlConnection con = new MySqlConnection())
{
//your stuff in here
}

另一个观察

cmd.Parameters.AddWithValue("@dateTimeNow", Convert.ToDateTime(DateTime.Now).ToString("yyyy-MM"))

DateTime.NowDateTime 不用再Convert

【讨论】:

    【解决方案2】:

    解决问题的更好方法是通过ExecuteScalar(SqlServer 的链接,但 MySql 的链接)并使用 COUNT 函数

    using(MySqlConnection con = new MySqlConnection("your_connection_string_here"))
    {
            con.Open();
            string query = "SELECT COUNT(*) FROM tblOrder WHERE dateTime_coded=@dateTimeNow";
            using(MySqlCommand cmd = new MySqlCommand(query, con))
            {
                cmd.Parameters.AddWithValue("@dateTimeNow", DateTime.Now.ToString("yyyy-MM");
                int count = (int)cmd.ExecuteScalar();
                Console.WriteLine("There are " + count.ToString() + " records");
            }
    }
    

    如您所见,我已删除此处无用的 try/catch 块,因为您不会对异常执行任何操作。如果您的查询包含语法错误或您无法与服务器建立连接,这将停止程序。因此,是否真的需要 try/catch 取决于您的要求

    (还添加了对来自 V4Vendetta 的 DateTime.Now 的观察)

    【讨论】:

    • 与没有相比,使用using block 有什么好处/效果?
    • 参见using statement 基本上,using 语句是一个 try/finally 块,finally 块关闭并处理在 using 行中声明和初始化的对象。这种语法优雅而有效。它消除了资源泄漏的可能性,特别是在数据库连接的情况下,非常昂贵。如果由于某种原因,您在 using 块中遇到异常,则可以保证您的代码将执行关闭并在右大括号处处理对象。
    【解决方案3】:

    您可以SELECT COUNT(*) FROM ... 然后使用 cmd.ExecuteScalar() 来检索返回的计数。

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多