【问题标题】:sql commnad not working for a select statement in c#sql命令不适用于c#中的select语句
【发布时间】:2026-01-16 05:20:02
【问题描述】:

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

但是当数据库表中有值并且给出正确的输入时,代码再次返回相同的 -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();
}

谢谢

【问题讨论】:

标签: c# .net windows-applications sqlcommand


【解决方案1】:

ExecuteNonQuery 不打算用于从您的查询中返回值。它执行查询,但只返回受 INSERT、UPDATE 或 DELETE 语句影响的行数。

如果您查看 MSDN 上ExecuteNonQuery 页面上的 REMARKS 部分,您会发现返回值 -1 的原因。

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

object result = cmd1.ExecuteScalar();
if(result != null)
{
     int conversionvalue = Convert.ToInt32(result);
     .....

}

【讨论】:

  • 非常感谢它提供的信息......我会将其标记为答案:)
【解决方案2】:

试试 ExecuteScalar

int conversionvalue = cmd1.ExecuteScalar();

【讨论】:

    【解决方案3】:

    对于单个值,您需要使用 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
    }
    

    【讨论】:

    • 确实,ExecuteScalar 内部使用 ExecuteReader,但请查看 ExecuteScalar page on MSDN 甚至 here on * 上的备注部分
    • @Steve - 谢谢,我知道。我确实提到了 ExecuteScalar 对于单个值是可以的,但我的示例包括 ExecuteReader,因为选择中的语法。如果它是SELECT TOP 1 ...SELECT COUNT() 或其他表明将始终返回恰好1 个值(或null)的东西,我也会用ExecuteScalar 的例子来回答(或者考虑到那里根本没有回答)已经是 ExecuteScalar 的 2 个很好的答案(你的和 techspider 的)。