문제가 생겼습니다. 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])
rTable
myAdapter.Fill
명령이 실행 된 후, 가치에 빠른 시계를 할 경우.
해당 테이블에 대한 데이터 세트가 없습니다. 일반 DataTable
을 사용하는 것을 볼 수 있습니다 (이 코드는 응용 프로그램 별 개체에서 모든 저장 프로 시저 호출을 단순화하기 위해 수정되었으므로 데이터 집합을 만들어이 수준에서 사용할 수 없습니다). 그래서 나는 생각하지 않는다.
값의 유효성을 검사했습니다. 심지어 각 문자의 유니 코드 값을 @ExtraInfo
값으로 검사하여 우연히 입력 된 제어 문자가 없는지 확인했습니다. 표시된 값과 일치하여 값을 망칠 나쁜 문자가 없습니다.
이 코드는 코드의 몇 군데에서 사용되지만 프로덕션 환경의 특정 데이터 집합에 대해서는 실패한 것으로 보입니다. 개발 환경에서 문제를 재현하지 못했습니다. 그래서 나는 그저 들어가서 그걸 가지고 놀 수는 없습니다.
다른 사람이 을 통해 NULL이 아닌 비어 있지 않은 varchar
에서 DBNull로 이동하는 원인을 알 수 있습니까? 나는 그 부름에 들어갈 수 없으므로 나는 눈이 멀다.
VB.NET을 사용하여 약 2 년 동안 기존 시스템을 디버깅 했으므로 확실한 내용을 놓칠 수 있습니다. 경험이 많은 동료도이 점을 이해하지 못합니다.)
문제에 대한 최종 단어를 추가하기 위해 편집 됨 : 좋은 오래된 Murphy 's Law를 제외하고는 해결책을 찾지 못했습니다. 잠시 동안 옆으로두기 후에, 나는 한 동료에게 한 번 보라고했다. 내가 그를 보여줄 때 문제는 발생하지 않았다. 나중에 또 다른 테스트가 정상적으로 작동하고 있음을 확인했습니다. 아무에게도 머피의 법칙이 확실한 해결책이 될 것이라고 약속 할 수는 없지만 그 자체만으로는 사라지는 일시적인 오류가 있음을 제안 할 수 있습니다.문제가 발생하면 행운을 빈다. 솔루션을 찾거나 진단 방법을 찾으면 알려 주시기 바랍니다. 고맙습니다!
시작 부분에 SET NOCOUNT ON을 필요로? – ahwm
CommandType을 StoredProcedure로 지정하는 것을 잊었습니까? – Steve
나는 전부를 달렸다. 그래서 MySp. CheckUserCanRun 기능은 권한이없는 사용자가 데이터를 볼 수 없도록하는 보안 검사입니다. – PaDe