Почему моя хранимая процедура всегда думает, что есть значение? - PullRequest
0 голосов
/ 28 июня 2011

У меня есть приложение ASP.NET 2010, использующее базу данных SQL 2005. Я пытаюсь построить хранимый процесс динамически, в зависимости от значений, выбранных на экране поиска. Я делал это много раз в предыдущих версиях .net & sql без проблем. Однако теперь мой оператор IF всегда действует так, как будто данные не передаются. Я отладил приложение и уверен, что данные устанавливаются. Я должен отметить, что когда я запускаю процедуру напрямую, с данными или без данных, возвращаются правильные данные.

Вот довольно простой сохраненный процесс ..

ALTER PROCEDURE get_cases_by_search_criteria
    @vin as varchar(30) = null
AS
declare @sqlstr varchar(1000)

set @sqlstr = 'SELECT 
[Case].CaseID, 
[Case].VIN, 
[Case].Make, 
[Case].Model, 
[Case].VehicleYear, 
if  @vin is not null and @vin <> ''
    set @sqlstr = @sqlstr + ' and ' + ('[Case].VIN = ''' + convert(varchar,@vin) + '''') 

exec(@sqlstr)

RETURN

А вот код, который вызывает хранимую процедуру ...

 Public Function GetCases(ByVal oSearchCriteria As SearchCriteria) As List(Of BE.Case)

    Dim lstCase As New List(Of BE.Case)
    Dim oCase As BE.Case
    Dim oProviderFactory As New ProviderFactory
    Dim oConnection As DbConnection
    Dim oReader As System.Data.IDataReader
    Dim oFactory As DbProviderFactory
    Dim oCmd As DbCommand
    Dim param1 As System.Data.Common.DbParameter

    Try
        'call my class to get an instance of the DBProviderFactory class
        oFactory = oProviderFactory.GetFactory
        'call another class of mine. pass in the DBProviderFactory class which will create a non-provider-specific connection object
        oConnection = oProviderFactory.GetProviderConnection(oFactory)

        'non-specific create command
        oCmd = oConnection.CreateCommand

        'non-specific parameter
        If oSearchCriteria.VIN.Length = 0 Then
            param1 = oFactory.CreateParameter()
            param1.ParameterName = "@vin"
            param1.DbType = DbType.String
            param1.Value = DBNull.Value
            oCmd.Parameters.Add(param1)
        Else
            param1 = oFactory.CreateParameter()
            param1.ParameterName = "@vin"
            param1.DbType = DbType.String
            param1.Value = oSearchCriteria.VIN
            oCmd.Parameters.Add(param1)

        End If

        oCmd.CommandType = CommandType.StoredProcedure
        oCmd.CommandText = "get_cases_by_search_criteria"

        Using (oConnection)
            oConnection.Open()
            oReader = oCmd.ExecuteReader()

            While oReader.Read
                oCase = New BE.Case

                'Case
                If oReader("CaseID") IsNot System.DBNull.Value Then oCase.CaseID = oReader("CaseID")

                If oReader("Make") IsNot System.DBNull.Value Then oCase.Make = oReader("Make")
                If oReader("Model") IsNot System.DBNull.Value Then oCase.Model = oReader("Model")
                If oReader("VehicleYear") IsNot System.DBNull.Value Then oCase.VehicleYear = oReader("VehicleYear")
                If oReader("VIN") IsNot System.DBNull.Value Then oCase.VIN = oReader("VIN")

                lstCase.Add(oCase)
            End While

            oConnection.Close()
        End Using
    Catch ex As Exception
        Throw ex
    End Try
    Return lstCase
End Function
...