Как правильно убрать возвращаемое значение из вызова в хранимую процедуру

Прежде всего, я хотел бы поблагодарить любого, кто читает это и отвечает. Ваша помощь очень ценится!

Я разрабатываю веб-приложение ASP.NET, в котором мне нужно читать и записывать в базу данных. Для этого я пытался вызвать из моего кода на C # несколько хранимых процедур, которые я написал. В частности, это:

public static bool userExistsInDB(string username) { int userExistsInDB = -1; using (SqlConnection con = new SqlConnection(DBConfig.DbConnectString)) { using (SqlCommand cmd = new SqlCommand("tb_user_exists", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username; con.Open(); userExistsInDB = cmd.ExecuteNonQuery(); } } return userExistsInDB == 1; } 

Хранимая процедура, которую я вызываю, была создана с помощью этого SQL-скрипта:

 CREATE PROCEDURE tb_is_logged_in @username VARCHAR(20) AS IF(EXISTS(SELECT * FROM logged_in_users WHERE "username" = @username)) BEGIN RETURN 1; END ELSE BEGIN RETURN 0; END 

Я тестировал его самостоятельно в SQL Server Management Studio и, похоже, работает. Однако, после прохождения моего кода на C #, я нахожу проблему с линией

 userExistsInDB = cmd.ExecuteNonQuery(); 

Хранимая процедура должна возвращать 1 или 0, если указанный пользователь существует в базе данных или нет, соответственно, и, как вы можете видеть, userExistsInDB инициализируется -1 . Однако после строки userExistsInDB = cmd.ExecuteNonQuery(); выполняется userExistsInDB никогда не изменяется; он всегда сохраняет значение -1 . Поэтому кажется, что возвращаю значение неверно. Что я делаю не так?

РЕДАКТИРОВАТЬ:

Благодаря Leonel, я нашел решение проблемы. Во-первых, я понял, что хранимая процедура, которую я вставил выше, была неправильной процедурой. Это не тот, который я на самом деле вызываю в своем коде C #, и когда я испробовал решение Leonel, это не сработало, потому что я случайно отредактировал процедуру, которую я вставил выше, вместо той, которую я на самом деле вызываю. Вот фактическая хранимая процедура, которую я вызывал:

 CREATE PROCEDURE tb_user_exists @username VARCHAR(20) AS IF(EXISTS (SELECT * FROM users WHERE username = @username)) BEGIN RETURN 1; END ELSE BEGIN RETURN 0; END 

Мое решение таково: измените эту строку

 userExistsInDB = cmd.ExecuteNonQuery(); 

в

 userExistsInDB = (int)cmd.ExecuteScalar(); 

и измените хранимую процедуру на:

 CREATE PROCEDURE tb_user_exists @username VARCHAR(20) AS IF(EXISTS (SELECT * FROM users WHERE username = @username)) BEGIN SELECT 1; END ELSE BEGIN SELECT 0; END 

Используйте SqlCommand.ExecuteScalar(); метод из MSDN

Например:

 userExistsInDB = (int)cmd.ExecuteScalar(); 

Пример кода будет выполнять SqlCommand и получить первую строку таблицы, если они существуют, и установить значение переменной в число элементов в таблице. В этом случае вы можете удалить оператор return и использовать

 SELECT * FROM logged_in_users WHERE "username" = @username 

А также всегда закрывайте соединение после его использования

 con.Open(); userExistsInDB = cmd.ExecuteScalar(); con.Close(); 

Если вы просто получите одно значение, executeScalar () будет достаточно хорошим. Если у вас все еще есть проблемы, вы можете спросить

 String get; Get=cmd.executescalar().tostring(); 
Давайте будем гением компьютера.