2012-05-30 9 views
4

Я пытаюсь получить целочисленное значение из одной таблицы на основе имени пользователя поля строки. Я пробовал его с помощью хранимой процедуры и прямого текста. Когда я исполняю хранимую процедуру, я получаю правильное возвращаемое значение; однако надлежащий результат не проходит.Получение единственного значения из запроса

Вот оба набора кода - Прямой текст -

public int GetUserRole(string CUSER) 
{ 
    try 
    { 
     SQLCON = new SqlConnection(connectionString); 
     SQLCON.Open(); 
     SQLCommand = new SqlCommand(); 
     SQLCommand.CommandType = CommandType.Text; 
     SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER; 
     SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = CUSER"; 
     Int32 USRole = (Int32) SQLCommand.ExecuteScalar(); 

     return USRole; 

    } 
    catch 
    { 
     HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false); 
     return 0; 
    } 
} 

SQL-запрос:

ALTER PROCEDURE [dbo].[spGetUserRole] 
-- Add the parameters for the stored procedure here 
    @username VARCHAR(50) 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @USRole as int 

-- Add the T-SQL statements to compute the return value here 
SELECT @USRole = tblUser.USRole FROM tblUser WHERE USUsername = @username 

-- Return the result of the function 
RETURN @USRole 
END 

ответ

8

Вы не правильно указали свой параметр. Если вы добавляете параметр с именем USUsername затем в тексте команды вы должны использовать @USUsername:

public int GetUserRole(string CUSER) 
{ 
    try 
    { 
     SQLCON = new SqlConnection(connectionString); 
     SQLCON.Open(); 
     SQLCommand = new SqlCommand(); 
     SQLCommand.CommandType = CommandType.Text; 
     SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER; 
     SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = @USUsername"; 
     Int32 USRole = (Int32) SQLCommand.ExecuteScalar(); 

     return USRole; 

    } 
    catch (Exception) 
    { 
     HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false); 
     return 0; 
    } 
} 

Ваша хранимая процедура также нуждается в обновлении в качестве имени параметра здесь также должны соответствовать и вам не нужно переменную возврата ,

ALTER PROCEDURE [dbo].[spGetUserRole] 
-- Add the parameters for the stored procedure here 
@USUsername VARCHAR(50) 

AS 
BEGIN 

-- Add the T-SQL statements to compute the return value here 
SELECT tblUser.USRole FROM tblUser WHERE USUsername = @USUsername 

END 

Вы также должны использовать синтаксис «using» для автоматического закрытия соединений с базой данных.Смотрите пример Скотта Хансельман здесь - http://www.hanselman.com/blog/WhyTheUsingStatementIsBetterThanASharpStickInTheEyeAndASqlConnectionRefactoringExample.aspx

+0

Int32 USRole = (Int32) SQLCommand.ExecuteScalar(); Если есть нулевые записи, которые будут взорваны на этой строке, вместо того, чтобы обрабатывать ошибку, вы поглощаете свой улов с помощью общего catch all Exception и return 0 –

1

Вместо того, чтобы использовать возвращаемое значение хранимой процедуры (RETURN @USRole), отправить результаты обратно используя оператор Select (например, Select @USRole). Происходит то, что возвращаемое значение хранимой процедуры не совпадает с возвращаемым значением, которое используется ExecuteScalar. ExecuteScalar возвращает первый столбец и строку вывода. Возвращаемое значение отличается и должно быть доступно с использованием специально названного параметра @RETURN_VALUE или специального свойства ParameterDirection.ReturnValue.

пересмотренный вариант вашей процедуры будет выглядеть следующим образом:

ALTER PROCEDURE [dbo].[spGetUserRole] 
-- Add the parameters for the stored procedure here 
@USUsername VARCHAR(50) 

AS 
BEGIN 

-- Add the T-SQL statements to compute the return value here 
Select tblUser.USRole 
FROM tblUser 
WHERE USUsername = @USUsername 

END 

RETURN (Transact-SQL)

SqlCommand.ExecuteScalar Method

+0

спасибо. Что-то настолько простое, вызывая столько обострения. Очень признателен! –

+0

@Thomas. Бит о «специально названном параметре« @ RETURN_VALUE »является правдой только в том случае, если вы вывели параметры с сервера, например. 'SqlCommandBuilder.DeriveParameters (CMD);'. В противном случае 'ParameterDirection.ReturnValue' является тем, что подсчитывается, и имя произвольно –

0

Используйте параметр правильно. И не забудьте закрыть связь с окончательным заявлением.

public int GetUserRole(string CUSER) 
    { 
     try 
     { 
      SQLCON = new SqlConnection(connectionString); 
      SQLCON.Open(); 
      SQLCommand = new SqlCommand(); 
      SQLCommand.CommandType = CommandType.Text; 
      SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = @USUsername "; 
      SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER; 

      Int32 USRole = (Int32) SQLCommand.ExecuteScalar(); 

      return USRole; 

     } 
     catch (Exception) 
     { 
      HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false); 
      return 0; 
     } 
     finally { close connection here.. } 

    } 
1

Я не знаю, как вы назвали вашу хранимую процедуру, но Theres ошибки в запросе, что вы публикуемый:

"SELECT USRole FROM tblUser WHERE USUsername = CUSER" 

следует заменить

SQLCommand.Parameters.Add("@USUsername", SqlDbType.VarChar).Value = CUSER; 
"SELECT USRole FROM tblUser WHERE USUsername = @USUsername" 


Вы в настоящее время на самом деле не делает параметр частью запроса, но пытается найти значение CUSER в столбце

0

Если вы настаиваете на использовании возвращаемого значения вы можете сделать это, установив направление параметров и использование ExecuteNonQuery

SqlParameter p = cmd.Parameters.Add("@USRole", SqlDbType.Int); 
p.Direction = ParameterDirection.ReturnValue; 
cmd.ExecuteNonQuery(); 
int returnvalue = (int)cmd.Parameters["@USRole"].Value; 

Если вы хотите использовать ExecuteScalar то просто изменить процедурный к select переменная вместо Return

Следует отметить, что то, что вы ввели для имени параметра, является произвольным.

Смежные вопросы