2016-07-12 2 views
0

문제가 생겼습니다. Google-fu도 나에게 실패 했으므로 전문가 도움을 받기 위해 서명했습니다.저장 프로 시저가 VB에서 null을 반환합니다.

문제는 복잡하고 몇 가지 청어 청어가 있습니다. 알아낼 수있는 것은 무엇이며, 중요한 정보를 처리 할 때 정확한 코드를 제공 할 수 없습니다. 제발 저를 참아주세요, 제가 할 수있는 한 정확하고 서술적이되도록 노력할 것입니다.

짧은 버전의 문제 : 서버에서 직접 실행될 때 한 행을 반환하는 저장 프로 시저 (SQL Server 2008 R2 서버)가 있습니다. VB.net 코드 (Visual Studio 2013 환경)를 통해 동일한 저장 프로 시저를 실행하면 열 값 중 하나가 DBNull로 변경됩니다. 코드 예제와

긴 버전 : 여기

는 저장 프로 시저를 데이터베이스에 직접 실행할 때 저장 프로 시저가 잘 실행

Create PROCEDURE MySP 
    @inputParms [five of them] 
AS 
BEGIN 
    DECLARE @UserCanRun int 
    DECLARE @ThisApp INT 

    EXEC @UserCanRun = dbname.dbo.CheckUserCanRun @InputParm1, @ThisApp --security check 

    IF @UserCanRun = 0 --Means no problem, can continue 
    BEGIN 
     DECLARE @ExtraInfo varchar(100) 

     SELECT @ExtraInfo = typeID + ' - ' + typeName 
     FROM [three joined tables] 
     WHERE [conditions using some @InputParm4] 

     SELECT DISTINCT 
      col1, ..., [colN-1], @ExtraInfo as colN, [colN+1], ..., colM 
     FROM 
      [8 joined tables and subqueries] 
     WHERE 
      [more conditions with @InputParms2 to 5] 
    END 
END 
GO 

의 청소 버전입니다; 모든 (사용 가능한) 정보가 올바르게 설정된 한 행을 반환합니다. (당신은 colN을 알게 될 것이고, 그것은 나에게 문제를 일으키는 것이고 동료는 변수의 값을 사용하는 것이 문제가되지 않는다는 사실을 보증한다.)

이제 VB.net에서 호출 할 때 코드 :

dim rTable As DataTable 
dim myCmd = New SqlCommand(SPName, myConnectionString) 
dim parameter As SQLParameter 
dim rValue As Integer = 0 

[set SQL parameters] 

If not myCmd is Nothing Then 
    If myCmd.Connection.State = connectionstate.Closed Then 
     [bit of security check code] 
     command.Connection.Open() 
    End If 
    Dim myAdapter As New SqlDataAdapter 
    myAdapter.SelectCommand = myCmd 
    myAdapter.Fill(rTable) 'problem! 
    ReturnValue = CInt(myCmd.Parameters(RETURN_VALUE_FIELD).Value) 
End If 
[more code] 

나는 정확히 같은 매개 변수를 사용하여 SP에 직접 가져 때하지 DBNull 동안, DBNull이를 반환 rTable.Rows(0).Item([M])rTablemyAdapter.Fill 명령이 실행 된 후, 가치에 빠른 시계를 할 경우.

해당 테이블에 대한 데이터 세트가 없습니다. 일반 DataTable을 사용하는 것을 볼 수 있습니다 (이 코드는 응용 프로그램 별 개체에서 모든 저장 프로 시저 호출을 단순화하기 위해 수정되었으므로 데이터 집합을 만들어이 수준에서 사용할 수 없습니다). 그래서 나는 생각하지 않는다.

값의 유효성을 검사했습니다. 심지어 각 문자의 유니 코드 값을 @ExtraInfo 값으로 검사하여 우연히 입력 된 제어 문자가 없는지 확인했습니다. 표시된 값과 일치하여 값을 망칠 나쁜 문자가 없습니다.

이 코드는 코드의 몇 군데에서 사용되지만 프로덕션 환경의 특정 데이터 집합에 대해서는 실패한 것으로 보입니다. 개발 환경에서 문제를 재현하지 못했습니다. 그래서 나는 그저 들어가서 그걸 가지고 놀 수는 없습니다.

다른 사람이 을 통해 NULL이 아닌 비어 있지 않은 varchar에서 DBNull로 이동하는 원인을 알 수 있습니까? 나는 그 부름에 들어갈 수 없으므로 나는 눈이 멀다.

VB.NET을 사용하여 약 2 년 동안 기존 시스템을 디버깅 했으므로 확실한 내용을 놓칠 수 있습니다. 경험이 많은 동료도이 점을 이해하지 못합니다.)

문제에 대한 최종 단어를 추가하기 위해 편집 됨 : 좋은 오래된 Murphy 's Law를 제외하고는 해결책을 찾지 못했습니다. 잠시 동안 옆으로두기 후에, 나는 한 동료에게 한 번 보라고했다. 내가 그를 보여줄 때 문제는 발생하지 않았다. 나중에 또 다른 테스트가 정상적으로 작동하고 있음을 확인했습니다. 아무에게도 머피의 법칙이 확실한 해결책이 될 것이라고 약속 할 수는 없지만 그 자체만으로는 사라지는 일시적인 오류가 있음을 제안 할 수 있습니다.문제가 발생하면 행운을 빈다. 솔루션을 찾거나 진단 방법을 찾으면 알려 주시기 바랍니다. 고맙습니다!

+0

시작 부분에 SET NOCOUNT ON을 필요로? – ahwm

+0

CommandType을 StoredProcedure로 지정하는 것을 잊었습니까? – Steve

+0

나는 전부를 달렸다. 그래서 MySp. CheckUserCanRun 기능은 권한이없는 사용자가 데이터를 볼 수 없도록하는 보안 검사입니다. – PaDe

답변

0

저장 프로 시저 당신은 당신이 성공적으로 서버의 절차를 실행했다,하지만`CheckUserCanRun`했다거나 '당신이 할 수 있었다 MySp` 실행했다

+0

그렇지 않습니다. 그리고 이것은 답이 아닙니다. 아직 -1입니다. –

+0

네 말이 맞아. 나는 그것을 뒤로했다. OLEDB는 반환 한 여러 레코드 집합을 처리하지 않는 한 NOCOUNT를 필요로했습니다. .NET SQLCommand 실제로 레코드 수를 작동하도록합니다. –

+0

문제는 OP에서 알 수 없으며 OP 읽기와 다릅니다. XY 문제가 의심됩니다. –

관련 문제