2009-12-16 38 views
11

我試圖對使用LIKE關鍵字和通配符的搜索查詢進行參數化。原來的SQL具有動態SQL這樣的:如何在Sql Server精簡版中使用LIKE參數

"AND JOB_POSTCODE LIKE '" + isPostCode + "%' " 

所以我已經試過這不是,但我得到一個出現FormatException:

"AND JOB_POSTCODE LIKE @postcode + '%' " 

編輯:我猜出現FormatException不會現身從Sql Server CE,按照要求,這裏是我如何在我的C#代碼中設置參數。該參數在代碼中設置這樣的:

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode; 

我也試過:

"AND JOB_POSTCODE LIKE @postcode" 

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode + "%"; 

但這並不返回任何結果。任何人都可以建議如何在這個搜索SQL中使用參數?

+0

全面查詢: @ 「SELECT * FROM JOB WHERE DELETED = false AND JOB_POSTCODE LIKE'」+ isPostCode +'%'「 – Colin 2009-12-16 17:37:33

回答

21

簡而言之,您應該將通配符放在參數的值中,而不是放在CommandText中。即

不是: sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode%"

這樣的:

sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode"; 
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode + "%"; 

朗答案在這裏:

我回去,並剝奪我的代碼到要領,這樣我可以在這裏發佈,在做這件事時,我發現我在原始問題中嘗試的最後一種方法確實有效。在我的測試中一定是有問題的。所以這裏有一個總結,以飽滿的代碼一直運行:

原始動態sql,容易受到SQL注入:

//Dynamic sql works, returns 2 results as expected, 
//but I want to use parameters to protect against sql injection 

string postCode = "G20"; 
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE '" 
         + postCode + "%'"; 
return Database.fGetDataSet(sqlCommand, 
          iiStartRecord, 
          iiMaxRecords, 
          "JOBVISIT"); 

使用參數首先嚐試給出一個錯誤:

//This syntax with a parameter gives me an error 
//(note that I've added the NVarChar length as suggested: 
//System.FormatException : @postcode : G20 - 
//Input string was not in a correct format. 
//at System.Data.SqlServerCe.SqlCeCommand.FillParameterDataBindings() 
//at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor, 
// Boolean& isBaseTableCursor) 

string postCode = "G20"; 
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode 
         + '%'"; 
sqlCommand.Parameters.Add("@postcode", 
          SqlDbType.NVarChar, 
          10).Value = postCode; 
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT"); 

第二種技術確實有效:

///This syntax with a parameter works, returns 2 results as expected 
string postCode = "G20"; 
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode"; 
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode 
                    + "%"; 
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT"); 

感謝所有的投入,對原誤導問題,對不起......

+1

SQLCE(或更可能是提供者)必須在內聯表達式中遇到問題 - 這可能是提供程序拋出錯誤的原因。我沒有SQLCE的測試平臺,甚至沒有注意到這是一個真正的SQL CE問題,直到我已經發布我的第一個答案:-( – 2009-12-17 15:29:04

+0

Cade,感謝您的輸入。它幫助我堅持使用我的代碼和測試,並幫助我走向代碼而不是sql。 – Colin 2009-12-18 21:35:28

2

使用:

"AND JOB_POSTCODE LIKE '" + isPostCode + "%' " 

...是指字符串被上漲到動態SQL之前建造。這樣,您就不必在sp_executesql/EXEC的參數列表中指定參數,而此時:

"AND JOB_POSTCODE LIKE @postcode + '%' " 

...確實。請發佈更多的查詢。

+1

動態SQL的作品,但我想用一個參數來防止SQL注入,我不能讓它工作 – Colin 2009-12-16 17:39:33

1

請發佈您的完整示例(包括您正在組裝您的呼叫的外部客戶端代碼)。如果您正確傳遞參數,則第二個和第三個選項都應該可以工作。你是在一個存儲過程還是內聯的參數化SQL中調用它?

我不承擔任何的SP,因爲我剛纔看到你正在使用CE ...

我認爲你需要add a length to your .Add call,因爲它是一個nvarchar

+0

你是對的,沒有SP。它是內聯參數化的sql。我編輯了這個問題,添加了將參數添加到命令的行。 SqlDbType.NVarChar可能是問題嗎? – Colin 2009-12-16 19:40:25

+0

凱德,我試圖增加長度,發現它沒有區別,但在更多的測試中,我發現第三個選項是工作。我很抱歉。請參閱我發佈的所有詳細信息。我很好奇爲什麼第二個選項不起作用......... – Colin 2009-12-17 10:24:00

3

這將在SQL Server 05中返回適當的結果(也可以用SP包裝),所以它看起來像是你嘗試過的最後一件事情。但是我沒有Compact Edition的測試平臺,所以也許這會有所作爲(我會很好奇,看看是否如此,爲什麼)。

declare @p1 nvarchar(50) 
set @p1 = 'f'   -- initial value passed from your app 
set @p1 = @p1 + '%' -- edit value for use with LIKE 
select * from JOB 
where JOB_POSTCODE like @p1 

編輯:

什麼版本SQLCE您使用的是?你能否告訴你的參數值是否真的從代碼傳遞給數據庫?我瀏覽了this MSDN tutorial,並至少從Visual Studio查詢設計器中獲得了要查找的結果。 (唯一的區別是我使用VS 2008和SQL Server Compact 3.5)。請參閱標題爲「創建新查詢」的部分;我用一些數據嘲笑了一個表,這個查詢按照你的意圖工作。

SELECT  JobID, PostCode, OtherValue 
FROM   Job 
WHERE  (PostCode LIKE @p1 + '%') 

就像我說的,我沒有寫任何代碼來調用查詢,但它在設計器中工作。換句話說,「它在我的機器上運行」。

+0

Sql Server CE不允許命名參數,並且declare關鍵字不存在,所以我不能使用你的sql 。我不知道如何在Management Studio中分配未命名的參數。我正在試試這個: SELECT * FROM JOB WHERE JOB_POSTCODE LIKE? +'%','G20' 但語法不正確 – Colin 2009-12-16 19:37:37

+1

@Colin,我想我從你的評論中學到的比你從我的答案中得到的更多;) - 也許編輯有幫助? – Matt 2009-12-16 22:00:10

+0

Matt, 感謝您的鏈接,現在我將能夠測試代碼之外的參數化查詢(我一直試圖在Management Studio中執行此操作,而不是Server Explorer)。我不認爲這個錯誤來自SqlServerCE,我認爲它來自.NET Compact Framework數據提供程序 - 請參閱我爲錯誤文本發佈的答案。爲了記錄我正在使用VS2005和Sql Server Compact 3.5 – Colin 2009-12-17 10:20:23

-1

你的答案是:

"AND JOB_POSTCODE LIKE '' + @postcode + '%' " 

和參數:

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode; 
相關問題