sql 命令不适用于 c# 中的 select 语句

sql commnad not working for a select statement in c#

我正在尝试使用 sql 命令执行以下代码以获取输出并将其存储在整数变量中。代码为空值插入返回 -1,这很好。

但是当数据库中有值时 table 并且给出正确的输入时,代码再次返回相同的 -1 值。

有人能给我指出正确的方向吗?

try {
    con.Open();
    SqlCommand cmd1 = new SqlCommand(@"(Select ERSConversionFactorID FROM " + schemaName + "[ERSConversionFactors] WHERE [ERSConversionFactor_CF] = @conversionvalue AND [ERSConversionFactor_Desc] = @convDescription)", con);

    if (comboBox_ConfacValue.Text == "")
    {
        cmd1.Parameters.Add("@conversionvalue", SqlDbType.NVarChar, 160).Value = DBNull.Value;
    }
    else
    {
        cmd1.Parameters.Add("@conversionvalue", SqlDbType.NVarChar, 160).Value = comboBox_ConfacValue.Text;
    }

    if (combobox_conversionDescription.Text == "")
    {
        cmd1.Parameters.Add("@convDescription", SqlDbType.NVarChar, 160).Value = DBNull.Value;
    }
    else
    {
        cmd1.Parameters.Add("@convDescription", SqlDbType.NVarChar, 160).Value = combobox_conversionDescription.Text;
    }

    string sql = "Select ERSConversionFactorID FROM " + schemaName + "[ERSConversionFactors] WHERE [ERSConversionFactor_CF] = @conversionvalue AND      [ERSConversionFactor_Desc] = @convDescription)";

    int conversionvalue = cmd1.ExecuteNonQuery();
}
catch (Exception ex)
{
    MessageBox.Show("Error : " + ex.Message);
}
finally
{
    con.Close();
}

谢谢

ExecuteNonQuery 不适用于查询中的 return 值。它执行查询,但 return 仅显示受 INSERT、UPDATE 或 DELETE 语句影响的行数。

如果您查看 MSDN 上 ExecuteNonQuery 页面上的备注部分,您会发现 return 值为 -1 的原因。

使用 SELECT 命令,如果您只想通过 SELECT 语句检索第一行的第一列,则可以使用 ExecuteReader 或更好的 ExecuteScalar。
但是,由于您的查询有一个 WHERE 语句可能导致没有检索到任何行,因此您应该在 ExecuteScalar

的 return 值上添加一个空值检查
object result = cmd1.ExecuteScalar();
if(result != null)
{
     int conversionvalue = Convert.ToInt32(result);
     .....

}

尝试执行标量

int conversionvalue = cmd1.ExecuteScalar();

您需要对单个值使用 ExecuteReader 或 ExecuteScalar。在这种情况下,我会使用 ExecuteReader,因为似乎没有保证总是会返回一行。

int? conversionvalue = null; // this will stay null if there is nothing read back
using(var reader = cmd1.ExecuteReader()) { // place the use of the reader in a using block to ensure it is cleaned up
    if(reader.Read()) // reader will return true if a record can be read. if you have multiple records you can turn the if into an while loop
        conversionvalue = reader.GetInt32(0); // read the value at ordinal position 0 as an int32
}