【问题标题】:MySqlException was unhandled when using count on SQL query在 SQL 查询中使用 count 时未处理 MySqlException
【发布时间】:2020-09-28 14:44:48
【问题描述】:

当我的 SQL 查询在查询中有计数函数时,它不想在 DBGRID 中显示数据,并且我收到“MySqlException was unhandled”错误。一旦我删除了 count 函数,它就会顺利运行并在 DB 网格上显示数据。

代码如下:

Dim connection As New MySqlConnection("Server info")

Dim cmd As New MySqlCommand("SELECT COUNT(a.client_id), a.CLIENT_ID,b.c_name, b.C_surname FROM tblinv_info a JOIN  tblclientinfo b ON a.CLIENT_ID = b.CLIENT_ID WHERE extract(year from a.inv_date) in ('2018','2019') AND a.Client_id = b.Client_id GROUP BY a.client_id ORDER BY count(a.client_id) desc LIMIT 10", connection)

cmd.CommandTimeout = 500

Dim adapter As New MySqlDataAdapter(cmd)

Dim table As New DataTable()

adapter.Fill(table)

dbreport.DataSource = table

知道为什么会发生这种情况吗?我正在使用 VB.NET 和 MySql 数据库在 Visual Studio 编码中运行该程序。 SQL 命令在 localhost 数据库上运行良好。

错误:错误代码如下:MySql.Data.dll中发生'MySql.Data.MySqlClient.MySqlException'类型的未处理异常

附加信息:尝试读取结果集时遇到致命错误。

【问题讨论】:

  • 如果你使用 count 你需要按所有选定的字段分组
  • 如上述评论所示,您当前的查询无效。您需要修复查询方面的帮助,还是在您的 VB.net 代码中添加 try-catch 逻辑以处理当前查询?
  • 非常感谢您的反馈。我只是假设在 localhost 数据库上显示正确的结果是正确的。我会看看是否可以通过添加 group by 子句来修复我的查询
  • @AndrichPienaar 您应该始终在查询编辑器中运行您的 SQL。当它实际运行时,然后在代码中尝试

标签: mysql sql vb.net


【解决方案1】:

我希望你一切都好。 我认为,问题是,在 Select 查询中,所有字段都有一个 name 列,但计数器没有。

    SELECT COUNT(a.client_id), a.CLIENT_ID,b.c_name, b.C_surname ...

而且,填充器和数据源不知道在哪里放置计数器列。 设置为计数器列的名称。

   SELECT COUNT(a.client_id) AS Counter1, a.CLIENT_ID,b.c_name, b.C_surname
   adapter.Fill(table)
   dbreport.DataSource = table

【讨论】:

  • 您好我将代码更新为以下 Dim 适配器 As New MySqlDataAdapter("SELECT COUNT(a.client_id) AS Counter1, a.CLIENT_ID,b.c_name, b.C_surname FROM tblinv_info a JOIN tblclientinfo b ON a.CLIENT_ID = b.CLIENT_ID WHERE extract(year from a.inv_date) in ('2018','2019') AND a.Client_id = b.Client_id ORDER BY count(a.client_id) desc LIMIT 10", connection) .我仍然遇到同样的错误
  • @AndrichPienaar 请更新您的问题,不要在 cmets 中发布代码
  • 这是一种很好的做法,但在这种情况下不是问题
【解决方案2】:

您在group by 中缺少您的字段

在 SQL 查询编辑器中运行它

SELECT COUNT(a.client_id) as cnt, a.CLIENT_ID, b.c_name, b.C_surname -- NOTE CHANGE
FROM
    tblinv_info a JOIN
    tblclientinfo b ON a.CLIENT_ID = b.CLIENT_ID 
WHERE
   extract(year from a.inv_date) in ('2018','2019') AND 
   a.Client_id = b.Client_id 
GROUP BY
   a.client_id, 
   b.c_name, -- NOTE CHANGE
   b.C_surname -- NOTE CHANGE 
ORDER BY 
   cnt desc  -- NOTE CHANGE
LIMIT 10

【讨论】:

  • 感谢您的协助!我将我的代码更新为您提供的内容,但它仍然给出 MySqlException is unhandled 错误。有关错误的附加信息表明在尝试读取数据集时遇到致命错误,该问题也显示在代码的 adapter.fill(table) 部分。知道我可以改变什么来让它工作
  • @AndrichPienaar 尝试添加sqlcommand.commandtype = CommandType.Text
  • @AndrichPienaar 另外,我们已经说过,像这样COUNT(a.client_id) 离开选择不是一个好习惯——更改为COUNT(a.client_id) as xxx 其中xxx 是您为其选择的任何名称,即groupCount
【解决方案3】:

听起来您的查询在执行期间超时。
您可以使用 CommandTimeout 增加命令超时。

cmd.CommandTimeout = 120; // 2 minutes (example)

详细代码:

Dim connection As New MySqlConnection("My Server info")
Dim cmd As New MySqlCommand("SELECT COUNT(a.client_id), a.CLIENT_ID,b.c_name, b.C_surname FROM tblinv_info a JOIN  tblclientinfo b ON a.CLIENT_ID = b.CLIENT_ID WHERE extract(year from a.inv_date) in ('2018','2019') AND a.Client_id = b.Client_id GROUP BY a.client_id ORDER BY count(a.client_id) desc LIMIT 10", connection)
cmd.CommandTimeout = 120
Dim adapter As New MySqlDataAdapter(cmd)
Dim table As New DataTable()
adapter.Fill(table)
dbreport.DataSource = table

【讨论】:

  • 您好,感谢您的回复。我复制了代码并输入了我的服务器信息,但我仍然收到与以前相同的错误。错误代码如下:MySql.Data.dll 中发生“MySql.Data.MySqlClient.MySqlException”类型的未处理异常附加信息:尝试读取结果集时遇到致命错误。
  • 您是否尝试过设置更长的 CommandTimeout?例如:cmd.CommandTimeout = Integer.MaxValue。您使用的是什么 MySQL 服务器版本?
【解决方案4】:

好的,我终于解决了问题。

我用作参考的 mysql.data.dll 文件 (ver6.3.5.0) 太旧了。

我下载了 6.4.4.0 版本并删除了旧参考,现在它显示完美。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多