1

에서 아무것도 반환하지 않는다. SqlServer에서 저장 프로 시저를 실행하면 올바르게 작동하고 type_id을 반환합니다. 내가으로 VisualStudio에서 함수에서 저장 프로 시저를 호출 할 때ExecuteScalar는이 I는 입력 파라미터로서 <em>TYPE_NAME</em> (VARCHAR (100))를 사용하여 출력 파라미터로서 <em>TYPE_ID</em> (INT)을 리턴하는 단순한 프로 시저를 저장 프로 시저

CREATE PROCEDURE [dbo].[intake_types_select_by_type_name] 
    @type_name varchar(100), 
    @type_id integer OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET XACT_ABORT ON 

    SELECT @type_id = type_id 
    FROM intake_types 
    WHERE type_name = @type_name 
END 

그러나, 매개 변수 반환 아무것도을 @type_id.

Public Shared Function sp_intake_types_select_by_type_name(ByVal conn As DBConnection, ByVal caseName As String) As Integer 
    Dim sp As SqlCommand = conn.GetStoredProcedure("intake_types_select_by_type_name") 
    With sp.Parameters 
     .Add("@type_name", SqlDbType.VarChar, ParameterDirection.Input).Value = caseName 
     .Add("@type_id", SqlDbType.Int) 
     .Item("@type_id").Direction = ParameterDirection.Output 
    End With 
    sp.ExecuteScalar() 
    If Not IsDBNull(sp.Parameters("@type_id").Value) Then 
     Return sp.Parameters("@type_id").Value 
    Else 
     Return Nothing 
    End If 
End Function 

나는 웹 검색에 많은 시간을 할애하여 도움이되지 않는다. 비슷한 저장 프로 시저 및 동일한 코딩 및 논리를 사용하는 다른 프로젝트 함수 및 작동합니다 (그러나 그것은 varchar OUTPUT 매개 변수로 반환합니다). 나는이 두 프로젝트를 비교하여 내가 단순하지만 기쁨이없는 것을보고 있는지 알아 본다.

+2

'Dim result = sp.ExecuteScalar()'를 시도 했습니까? – Fabio

+0

필자가 본 모든 예는'TypeID = (Int32) sp.ExecuteScalar()'와 같은 기능을합니다. 다른 프로젝트에서'sp.ExecuteScalar()'에 대한 호출을 간단하게하고 있습니까? –

+0

'.Item ("@ type_id"). Direction = ParameterDirection.Output'을 제거하고 .Add ("@ type_id", SqlDbType.Int)를 .Add ("@ type_id", SqlDbType.Int, ParameterDirection)로 변경하십시오. Output)'을 선택하고 ExecuteScalar를 ExecuteNonQuery()로 변경하십시오. 나는 그것이 당신의 문제를 해결할지는 모르지만 그것은 시험할만한 가치가있다. –

답변

1

정말 Option Strict On을 사용해야하며 문제가 해결되어야합니다. 현재 데이터 형식 간의 암시 적 변환이 수행되어 코드가 훨씬 느려지고 오류가 발생하기 쉽습니다.

CREATE PROCEDURE [dbo].[intake_types_select_by_type_name] 
    @type_name varchar(100) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET XACT_ABORT ON; 

    SELECT type_id 
    FROM intake_types 
    WHERE type_name = @type_name 
END 

그리고 함수를 호출 :

Option Strict On 
' ....' 

Public Shared Function sp_intake_types_select_by_type_name(ByVal conn As DBConnection, ByVal caseName As String) As Integer 
    Dim sp As SqlCommand = conn.GetStoredProcedure("intake_types_select_by_type_name") 
    sp.Parameters.Add("@type_name", SqlDbType.VarChar, 100).Value = caseName 

    Dim result As Object = sp.ExecuteScalar() 

    If result Is Nothing Then 
     Return -1 ' check for -1 in the calling code ' 
    Else 
     Return CInt(result) 
    End If 

End Function 

그것은 데이터베이스를 다시 할 수 있도록 SQL 매개 변수의 크기를 지정하는 것이 좋습니다 거의 항상

나는 다음과 같은 제안 - 매개 변수의 각 길이에 대해 새로운 실행 계획을 세우는 대신 실행 계획을 사용하십시오.

모든 SQL 연결을 하나의 연결로 사용하는 것은 일반적으로 바람직하지 않습니다. 연결을 사용하고 즉시 사용하는 즉시 처분해야합니다. 처음에는 좋은 생각 인 것 같지만 설계된 방식에 맞서 싸우고 있습니다 (connection pooling). 빠른 연결 재 연결을 처리합니다.

참조 : Execute Scalar to trap error in case of no records returned.

+0

Andrew, 팁과 우수한 설명, 그리고 작동하는 솔루션에 대해 많은 감사드립니다. ** Option Strict On **은 내가 고쳐 쓴 두 개의 암시 적 변환을 밝혀 냈습니다. 나는 모든 것을 위해 하나의 SQL 연결을 사용하는 대신에 SQL 연결을 사용/폐기하는 방법을 모색 할 것이다. 나는 너의 시간과 훌륭한 의견에 정말로 감사한다! –

+0

@MichaelCallas 환영합니다 :) 이미 완료하지 않았다면 Option Strict On을 새 프로젝트의 기본값으로 설정하는 것이 좋습니다. 내가 링크 된 게시물의 또 다른 답변에 관해서는, 실제 데이터베이스에 대해 VB 스 니펫을 실제로 테스트하여, Is Nothing이 작동하고 DbNull.Value Is가 잘못된 결과를 제공하는지 확인합니다. –

+0

Andrew, 새 프로젝트에 대한 기본 설정이 있지만이 프로젝트가 상속 된 프로젝트이므로 여러분이 그 프로젝트를 지적 해 주어서 기쁩니다. 나는 또한 귀하의 게시물에 링크를 읽어 주셔서 감사합니다. 좋은 물건. –

관련 문제