从表

时间:2016-02-01 12:29:22

标签: c# mysql

我正在尝试从表中选择最佳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
}

4 个答案:

答案 0 :(得分:3)

ExecuteNonQuery不会返回从db中选择的值。

试试这样:

    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()); 
    }

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

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