Команда sql не работает для оператора select в С#

Я пытаюсь выполнить приведенный ниже код с помощью команды 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();
}

Спасибо


person Gowtham Ramamoorthy    schedule 27.04.2016    source источник
comment
вам нужно изучить это - msdn.microsoft.com/en-us/library/   -  person techspider    schedule 27.04.2016


Ответы (3)


ExecuteNonQuery не предназначен для возврата значений из вашего запроса. Он выполняет запрос, но возвращает только количество строк, затронутых инструкцией INSERT, UPDATE или DELETE.

Если вы посмотрите на раздел ПРИМЕЧАНИЯ на ExecuteNonQuery в MSDN вы найдете причину возвращаемого значения -1.

С командой SELECT вы можете использовать ExecuteReader или лучше ExecuteScalar, если вы просто хотите, чтобы первый столбец первой строки был получен с помощью оператора SELECT.
Однако, поскольку в вашем запросе есть оператор WHERE, который может привести к тому, что строки не будут получены, вы должны добавить проверку на нуль в возвращаемом значении Выполнить скаляр

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

}
person Steve    schedule 27.04.2016
comment
потрясающе, спасибо за информацию, она сработала ... я отмечу это как ответ :) - person Gowtham Ramamoorthy; 27.04.2016

Попробуйте выполнить скаляр

int conversionvalue = cmd1.ExecuteScalar();
person techspider    schedule 27.04.2016

Вам нужно использовать либо 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
}
person Igor    schedule 27.04.2016
comment
Это правда, что ExecuteScalar внутри использует ExecuteReader, но взгляните на раздел «Примечания» на ExecuteScalar на странице MSDN или даже здесь, на StackOverflow - person Steve; 27.04.2016
comment
@ Стив - спасибо, я в курсе. Я упоминал, что ExecuteScalar подходит для одиночных значений, но мой пример включал ExecuteReader из-за синтаксиса в выборе. Если бы это было SELECT TOP 1 ... или SELECT COUNT() или что-то еще, что указывало бы на то, что всегда будет возвращаться ровно 1 значение (или ноль), я бы также ответил с примером ExecuteScalar (или вообще не ответил, учитывая, что было 2 хороших ответа (ваш и techspider) уже с ExecuteScalar). - person Igor; 27.04.2016