2011-06-23 135 views
0

我有一個asp.net 4.0應用程序打sql 2008分貝。我有一個非常基本的存儲過程,旨在返回記錄。它在.net ide服務器瀏覽器中執行時有效。但是,當我遍歷.net代碼時,即使變量以我喜歡的方式傳遞(並且之前已經完成了許多次ime),也不會返回任何內容。這裏是存儲過程...爲什麼我的存儲過程不能正確運行?

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) 

這裏是我如何傳遞的價值觀......

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

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

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

      While oReader.Read 
+1

你可以Exec的它SQL Management Studio並打印@sqlstr?它可能會幫助您確定select語句是否有問題。 – CatchingMonkey

+0

我可以看到你的代碼沒有問題。也許嘗試在一個語句中添加所有參數oCmd.Parameters.Add(「@ vin」,oSearchCriteria.VIN,DbType.String) –

+0

如果我打印出來並打印出(在傳入VIN的有效參數之後)會期待。而且,當我複製並粘貼到sql編輯器中時,它會運行並返回記錄! – lollygag

回答

0

@vin等於'; DROP DATABASE UserDB; --會發生什麼?

這可能不是您想要解決的問題,但您使用動態SQL的方式會使您容易受到SQL Injection Attack的影響。

而不是使用exec(@sql)串的,你應該使用sp_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 
相關問題