Asp.net 为什么我的存储过程不能正确运行?

Asp.net 为什么我的存储过程不能正确运行?,asp.net,stored-procedures,Asp.net,Stored Procedures,我有一个asp.net 4.0应用程序运行sql 2008 db。我有一个非常基本的存储过程,用于返回记录。当我在.net ide服务器资源管理器中执行它时,它就会工作。但是,当我一步一步地浏览.net代码时,即使变量以我喜欢的方式传递(之前已经多次传递过),也不会返回任何内容。这是存储过程 ALTER PROCEDURE get_cases_by_search_criteria @vin as varchar(50) = null AS declare @sqlstr var

我有一个asp.net 4.0应用程序运行sql 2008 db。我有一个非常基本的存储过程,用于返回记录。当我在.net ide服务器资源管理器中执行它时,它就会工作。但是,当我一步一步地浏览.net代码时,即使变量以我喜欢的方式传递(之前已经多次传递过),也不会返回任何内容。这是存储过程

    ALTER PROCEDURE get_cases_by_search_criteria
    @vin as varchar(50) = null

AS
declare @sqlstr varchar(5000)

set @sqlstr = 'SELECT 
                [Case].CaseID, 
                [Case].VIN, 
                [Case].Make, 
                [Case].Model, 
                Contact.FirstName, 
                Contact.LastName, 
                FROM  [Case] INNER JOIN
                Contact ON [Case].CaseID = Contact.CaseID 
                Where Contact.ContactTypeID = 1 '

                if  @vin is not null and @vin <> ''
                BEGIN
                    set @sqlstr = @sqlstr + ' and ' + ('[Case].VIN = ''' + convert(varchar,@vin) + '''') 
                END

exec(@sqlstr)

@vin
等于
时会发生什么;删除数据库UserDB--

这可能不是您想要解决的问题,但您使用动态SQL的方式使您容易受到攻击

不要使用
exec(@sql)
string,而应该使用
sp\u executesql
,并将
@vin

DECLARE @sqlstr varchar(5000)
DECLARE @ParmDefinition NVARCHAR(500)

SET @sqlstr  = 'SELECT 
                [Case].CaseID, 
                [Case].VIN, 
                [Case].Make, 
                [Case].Model, 
                Contact.FirstName, 
                Contact.LastName, 
                FROM  [Case] INNER JOIN
                Contact ON [Case].CaseID = Contact.CaseID 
                Where Contact.ContactTypeID = 1 '

IF  @vin is not null and @vin <> ''
BEGIN
    SET @sqlstr = @sqlstr + ' and [Case].VIN = @vinparm'
END

SET @ParmDefinition = N'@vinparm varchar(50)'

EXECUTE sp_executesql @sqlstr, @ParmDefinition, @vinparm = @vin
DECLARE@sqlstr varchar(5000)
声明@ParmDefinition NVARCHAR(500)
SET@sqlstr='选择
[案例].CaseID,
[案例].VIN,
[案例]。制作,
[案例].模型,
联系人:FirstName,
Contact.LastName,
来自[案例]内部联接
[Case]上的联系人。CaseID=Contact.CaseID
其中Contact.ContactTypeID=1'
如果@vin不为空且@vin“”
开始
设置@sqlstr=@sqlstr+'和[Case].VIN=@vinparm'
终止
设置@ParmDefinition=N'@vinparm varchar(50)'
执行sp_executesql@sqlstr、@ParmDefinition、@vinparm=@vin

您能否执行SQL Management studio并打印@sqlstr?它可能会帮助您确定select语句是否有错误。我可以看到您的代码没有问题。也许可以尝试在一条语句oCmd.Parameters.Add(“@vin”,oSearchCriteria.vin,DbType.String)中添加参数,如果我打印出来并完全按照预期打印出来(在为vin输入有效参数之后)。而且,当我复制并粘贴到sql编辑器中时,它会运行并返回记录!是否使用SQLDataAdapter读取断开连接的记录集?是否确定web.config指向正确的服务器和数据库?另外,您是否可以使用SQL Profiler监视数据库服务器,以确保查询将转到它?
DECLARE @sqlstr varchar(5000)
DECLARE @ParmDefinition NVARCHAR(500)

SET @sqlstr  = 'SELECT 
                [Case].CaseID, 
                [Case].VIN, 
                [Case].Make, 
                [Case].Model, 
                Contact.FirstName, 
                Contact.LastName, 
                FROM  [Case] INNER JOIN
                Contact ON [Case].CaseID = Contact.CaseID 
                Where Contact.ContactTypeID = 1 '

IF  @vin is not null and @vin <> ''
BEGIN
    SET @sqlstr = @sqlstr + ' and [Case].VIN = @vinparm'
END

SET @ParmDefinition = N'@vinparm varchar(50)'

EXECUTE sp_executesql @sqlstr, @ParmDefinition, @vinparm = @vin