【问题标题】:Select the greater ID from a table从表中选择更大的 ID
【发布时间】:2016-02-01 12:29:22
【问题描述】:

我正在尝试从表中选择最佳 ID 并插入变量(可以是 int 或 long)。我的代码有点工作,但它没有得到它应该得到的数字。相反,它一直是 -1。

Ps1 - RXRX 是 ID 列。

Ps3 - 我已经尝试将 ExecuteNonQuery 替换为 ExecuteReader,但我收到以下错误:无法将类型 System.Data.SqlClient.SqlDataReader 隐式转换为 int

private int aux;

if(some condition)
{
    MessageBox.Show("Should get a positive number in the next messageBox");
    cmd.CommandText = "SELECT MAX(RXRX) from tablee"; 
    aux = cmd.ExecuteNonQuery();
    MessageBox.Show(aux.ToString()); //Gets -1 all the time
}

怎么了?遗憾的是,我不能使用 LAST INSERT ID 命令,因为该人可以在插入任何数据之前进入此 IF。

更新:得到答案。现在它正在工作,谢谢大家:

if(some condition)
{
            MessageBox.Show("Should get a positive number in the next messageBox");
            cmd.CommandText = "SELECT MAX(RXRX) from tablee";
            aux = Convert.ToInt32(cmd.ExecuteScalar()); //Thanks Joachim Isaksson
            MessageBox.Show(auxiliar.ToString()); //Now it works fine
}

【问题讨论】:

  • cmd.ExecuteScalar() 怎么样?
  • 我之前尝试过,但有些东西不允许。我收到消息:“无法将类型 '' 隐式转换为 'int'。存在显式转换(您是否缺少演员表?)”

标签: c# mysql


【解决方案1】:

ExecuteNonQuery 不会返回从数据库中选择的值。

试试这样:

    if(some condition)
    {
                MessageBox.Show("Should get a positive number in the next messageBox");
                cmd.CommandText = "SELECT MAX(RXRX) from tablee"; 
               object readedValue= cmd.ExecuteScalar();
               if(readedValue != null)
               {
                 aux=(int)readedValue; //Will always get the value
               }
                MessageBox.Show(aux.ToString()); 
    }

【讨论】:

  • 我试过了。我收到以下消息:无法将类型 '' 隐式转换为 'int'。存在显式转换(您是否缺少演员表?)
  • 在 eoq.exe 中发生了“System.InvalidCastException”类型的未处理异常附加信息:“无效转换”
  • 是的,但仍然无法正常工作。代码可以编译,但是当我运行程序并进入 IF 时,它显示:“指定的转换无效”。
  • RXRX 列的类型是什么?
  • 它是整数。我有 ID。
【解决方案2】:

ExecuteScalar 将返回您的计数的单个值(或者 - 从技术上讲 - 结果第一行的第一列),您可以将其转换为 int 并立即使用;

aux = Convert.ToInt32(cmd.ExecuteScalar());

由于 Sql Server 返回一个 int32 作为计数,而 - 例如 - Oracle 返回一个完全不同的类型,最安全的方法通常是使用 Convert.ToInt32 来获取值(假设您计算的行数少于 20 亿行)

【讨论】:

  • 没错!谢谢朋友,我会更新帖子以帮助其他人。一个问题,对不同的命令使用相同的 MySqlCommand 是不是一个坏主意?比如,在需要时更改 cmd.CommandText?
  • @ArthurMFB 通常,您需要在将命令用于查询后处理它,以便它可以以最有效的方式自行清理。对于像 MySQL 这样的“主流” ADO 提供程序,我会特别小心地重用它。
  • 我明白了。我会开始使用它。又是 Ty。
【解决方案3】:

请改用ExecuteScalar()。这是当您的查询返回单个值时使用的方法。

【讨论】:

    【解决方案4】:

    ExecuteNonQuery() 返回受影响的行数。由于您的查询不会影响任何行,因此结果为-1。 (例如,如果您删除了两行,则结果将是 2)。

    要从 SQL 查询中检索单个结果,请使用 ExecuteScalar()。这将返回一个object,代表查询结果第一行的第一列。
    如果没有返回结果,则返回值为null
    如果返回值为 SQL NULL,则结果为DbNull.Value

    【讨论】:

    • 明白。不知道这种模式。谢谢朋友。
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2017-08-08
    • 2020-02-11
    • 2023-03-19
    相关资源
    最近更新 更多