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