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

时间:2016-04-27 15:36:36

标签: c# .net windows-applications sqlcommand

我正在尝试使用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();
}

由于

3 个答案:

答案 0 :(得分:4)

.post_blog { border: 1px solid #F1EBEB; padding-left: 20px; margin-bottom: 20px; height: 300px; width: 40%; float: left; margin-left: 40px; } .blog_left_side { float:left; margin-right: 20px; } .wpis_title { margin-top: 20px; font-weight: 600; font-size: 22px; } .wpis_title a { text-decoration:none; } article.blog_post { background-color: #fff; border: 1px solid #eeeeee; -webkit-box-shadow: inset 15px 15px 20px 5px rgba(0, 0, 0, .03); box-shadow: inset 15px 15px 20px 5px rgba(0, 0, 0, .03); padding:20px; height:900px; } .news_read_more { text-align: right; margin-right: 10px; } 不用于从查询中返回值。它执行查询但它只返回受INSERT,UPDATE或DELETE语句影响的行数。

如果您查看MSDN上ExecuteNonQuery页面上的“备注”部分,您将找到返回值为-1的原因。

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

ExecuteNonQuery

答案 1 :(得分:3)

尝试ExecuteScalar

int conversionvalue = cmd1.ExecuteScalar();

答案 2 :(得分:1)

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

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
}