2013-05-06 2 views
1

с помощью ASP.NET, C#, SQL Server 2008.SQL не возвращает значение, если нуль даже при присваивании

Сценарий: попыток пользователя войти в веб-приложение. Приложение проверяет имя пользователя против списка, чтобы получить UserID. Если этот пользователь является известным пользователем, страница открывается нормально. Если пользователь не является известным пользователем, он ДОЛЖЕН открыт для публикации с уведомлением, чтобы связаться с администратором.

Мне не удалось написать хранимую процедуру SQL, чтобы она вернула значение 0 (или что-то еще в этом случае), чтобы его можно было использовать для запуска элементов управления. Я выполнил SQL как тест, и он работает; но он каждый раз ошибается на стороне asp.

Любая помощь очень ценится!

SQL Server код хранимой процедуры:

ALTER PROCEDURE [dbo].[spGetUserID] 
-- Add the parameters for the stored procedure here 
    (@Username as varchar(64)) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @X INT 

    SET @X = (SELECT COUNT(*) FROM Users WHERE (Username = @Username)) 

    If @X > 0 
    RETURN 
     (SELECT UID FROM Users WHERE (UserName = @Username)) 
    ELSE 
    RETURN 99999 --IVE ALSO TRIED USING 0 HERE. 
END 

ASP.NET вызов хранимых процедур

public int GetUserID(string Username) 
{ 
     try 
     { 
      SQLCON = new SqlConnection(connectionString); 
      SQLCON.Open(); 
      SQLCmd = new SqlCommand("spGetUserID", SQLCON); 
      SQLCmd.CommandType = CommandType.StoredProcedure; 
      SQLCmd.Parameters.Add("@username", SqlDbType.VarChar).Value = Username; 
      int userID = (Int32)SQLCmd.ExecuteScalar(); 
      return userID; //THIS ALWAYS JUMPS TO EXCEPTION 
     } 
     catch 
     { 
      return 0; 
     } 
     finally 
     { 
      SQLCON.Close(); 
     } 
    } 
+2

И ** ЧТО ** исключение вы получаете? Пожалуйста, предоставьте полное, полное и точное исключение (в том числе любое '.InnerException', которое у вас может быть) –

+0

, из какого типа UID? – Guanxi

+0

@Guanxi: Возвращаемое значение из хранимой процедуры всегда является «int» – Andomar

ответ

5

ExecuteScalar() предназначен для запроса, который возвращает одну строку с одной колонкой.

Чтобы получить возвращаемое значение хранимой процедуры, используйте параметр с направлением ReturnValue:

sqlcomm.Parameters.Add("@retVal", SqlDbType.Int).Direction = 
    ParameterDirection.ReturnValue; 
SQLCmd.ExecuteNonQuery(); 
var result = (int) sqlcomm.Parameters["@retVal"].Value; 
+0

, спасибо, @Andomar, ценный урок. –

1

Попробуйте разворачивать ваш оператор выбора. Команда ExecuteScalar извлекает первый столбец первой строки в результирующем наборе или пустую ссылку, если набор результатов пуст. Ваш сохраненный proc фактически не возвращает результирующий набор. Попробуйте ...

ALTER PROCEDURE [dbo].[spGetUserID] 
-- Add the parameters for the stored procedure here 
    (@Username as varchar(64)) 
AS 
BEGIN 
    If Exists(SELECT 1 FROM Users WHERE (Username = @Username)) 
    SELECT UID FROM Users WHERE (UserName = @Username) 
    ELSE 
    SELECT 99999 
END 
+0

+1 Это также работает для нецелых! – Andomar

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