Stored procedures 为什么我的存储过程总是认为有一个值?

Stored procedures 为什么我的存储过程总是认为有一个值?,stored-procedures,Stored Procedures,我有一个ASP.NET 2010应用程序运行SQL 2005 db。我正试图根据搜索屏幕上选择的值动态构建存储过程。我已经在.net和sql的previosu版本中多次这样做,没有问题。然而,现在,我的IF语句总是像没有传入数据一样工作。我已经调试了该应用程序,并确信数据正在设置中。我应该注意,当我直接运行这个过程时,不管有没有数据,都会返回正确的数据 下面是一个相当简单的存储过程 ALTER PROCEDURE get_cases_by_search_criteria @vin as

我有一个ASP.NET 2010应用程序运行SQL 2005 db。我正试图根据搜索屏幕上选择的值动态构建存储过程。我已经在.net和sql的previosu版本中多次这样做,没有问题。然而,现在,我的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

你能发真实代码吗?这不是语法上的correct@marc_s:in cast and convert默认为30“当数据定义或变量声明语句中未指定n时,默认长度为1。当使用cast and convert函数时未指定n时,默认长度为30。”@gbn:谢谢!一个人永远不会停止学习(即使在我这个年纪)!;-)
 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