2011-08-12 1 views
2

내가 가진 저장 프로 시저의 출력 매개 변수에 간헐 null 값이 나타납니다. 저장 프로 시저 내부의 NOLOCK과 관련이 있는지 궁금합니다. 그것은 대부분의 시간 동안 작동하지만 간헐적으로 실패합니다. 특히 높은 부하 상태. 대부분의 시간은 예상 할 "y"또는 "n"을 반환합니다. 여기 높은 트래픽 SQL 테이블 간헐 Null 출력 매개 변수

SqlConnection con = getCon(); 
SqlCommand cmd = new SqlCommand("loginRecord", con); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add(new SqlParameter("@username", username)); 
cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@exists", System.Data.SqlDbType.VarChar, 3, System.Data.ParameterDirection.Output, false, ((System.Byte)(0)), ((System.Byte)(0)), "", System.Data.DataRowVersion.Current, null)); 

try 
{ 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
} 
catch (Exception ex) 
{ 
    Util.sendErrorEmail(ex.ToString()); 
} 
finally 
{ 
    con.Close(); 
} 

//The following line is the one that throws an "Object reference not set to an instance of an bject." exception 
string userExists = cmd.Parameters["@exists"].Value.ToString(); 

저장된 프로 시저이다

ALTER PROCEDURE [dbo].[loginRecord] 
(
    @username nvarchar(100), 
    @exists char(1) OUTPUT 
) 

AS 
IF EXISTS(select username from Users WITH (NOLOCK) where username = @username) 
    BEGIN 
     set @exists='y' 
    END 
ELSE 
    BEGIN 
     set @exists='n' 

     --insert user account-- 
     insert into Users (username, datejoined) 
     values (@username, getdate()) 
    END 
insert into Logins (username, logged) 
values (@username, getdate()) 

GO 
+0

실패 (null 반환)하면 반환 할 항목은 무엇입니까? Y 또는 N 상황 또는 둘 다에 항상 실패합니까? –

+0

저장 프로 시저를 보면 if/else가 있는데 값이 무엇이든 관계없이 설정해야하는 것처럼 보입니다. 해당 사용자가 아직 존재하지 않으면 Users 테이블에 삽입해야합니다. – Robert

+0

예,하지만 문제가 하나 또는 다른 상황에서만 발생하는지 확인하려고합니다. 하나 또는 다른 상황에서만 발생하는 경우 해결하는 것이 더 간단한 문제입니다. –

답변

1

내 추측 @exists 값이 할당되기 전에 예외가 발생된다는 점이다. 나는로 내 캐치를 변경할 것 :

Catch(Exception ex) { Util.sendErrorEmail(ex.ToString()); return; }

+0

예외가 잡히지 않습니다. 거기에 지정한 줄까지 실패하지 않습니다. ELMAH 로깅이 있고 전체 시도/catch/finally 줄이 실패한 줄을 보여줍니다. – Robert

+0

ELMAH는 기본 동작을 변경하지 않는 한 처리되지 않은 예외를 기록합니다. Catch 루프 때문에 발생하는 모든 예외가 처리되고 기록되지 않습니다. 당신은 또한 어떤 예외를 게시 할 수 있습니까? –

+0

Jeff 나는 당신이 말한 것을 보았습니다. 저장된 proc은 예외를 던져야합니다. 위의 주석에서 "Martin Smith"는 저장된 proc이 스레드로부터 안전하지 않다고 말합니다. 거기에 중복 된 사용자 이름을 삽입하려고 시도하고 있습니다. 나는 그에게 그 문제를 어떻게 해결할 것인지 물어볼 것입니다. – Robert

0

나는 그것이 저장 프로 시저의 구현과 아무 상관이 없다 생각합니다. 이벤트가 저장 프로 시저에서 @exists 변수에 대해 의도적으로 null을 반환하면 "cmd.Parameters ["@ exists "] .Value"는 C#에서 null이 아닙니다. 대신 유효한 개체 인 'System.DBNull'이 될 것이므로 메서드를 호출 할 수 있습니다.

이 질문에 대한 직접적인 대답은 아니지만 범위를 좁히는 데 도움이됩니다.