2013-12-13 37 views
3

我試圖傳遞參數爲int類型數組有一個問題。我在下面做了什麼,但兩種方法都失敗了。EF ExecuteSqlCommand與int數組參數

方法1(失敗)

int[] CategoryArray; 
CategoryArray = new int[userItem.ListItemId.Count()]; 
int i=0; 

foreach (int catID in userItem.ListItemId) 
{ 
    CategoryArray[i] = catID; 
    i++; 
} 

db.Database.ExecuteSqlCommand("delete from SupportRegion where UserId={0} and CategoryID not in ({1})", userItem.UserId, CategoryArray); 

方法2(也失敗)

db.Database.ExecuteSqlCommand("delete from SupportRegion where UserId={0} and CategoryID not in ({1})", userItem.UserId, String.Join(",", userItem.ListItemId)); 

我怎樣才能使人們有可能在限定參數作爲整數數組?

非常感謝

回答

4

由於數據庫不理解int數組的含義,第一種情況將不起作用。我不知道是什麼在第二個例子「失敗」的意思,但我想,SQL Server可以把字符串轉換爲int。我認爲正在發生的事情在服務器端是查詢轉換爲這樣的事情(注意引號):

delete from SupportRegion where UserId={0} and CategoryID not in ('1, 2, 3') 

因爲你傳遞的參數是一個字符串。但是,CategoryID列不是字符串,傳遞的參數不能轉換爲int。

我想你可以嘗試使用一個表值參數是什麼,但它看起來像setting it up是有點難看。

取決於你有多少實體刪除最安全的辦法可能是把實體客戶端,標記要刪除的刪除和調用的SaveChanges()中的那些。

另一個解決辦法是設置您的命令文本右(見下文聲明):

db.Database.ExecuteSqlCommand(
    string.Format(
     "delete from SupportRegion where UserId={{0}} and CategoryID in ({0})", 
     String.Join(",", userItem.ListItemId), 
     userItem.UserId)); 

這樣的String.Format調用應該嵌入您的整數的列表作爲一個文本,然後它向下傳遞到ExecuteSqlCommand方法將會照顧用戶ID。

免責聲明 上述方法可能被Sql Injection攻擊利用。 決不使用它,如果你不控制你用它來建立ID列表要刪除的數據源。一般來說,我會建議不要使用這種方法,除非你真的知道它是如何使用的,你肯定沒有什麼不好的事情發生(你真的永遠不會......)

+0

嗨先生@帕維爾..方法2失敗與您在方法1中解釋的相同的原因:-)。我在EF和Web編程真正的新基本,所以我不太懂的「上述方法可以通過SQL注入攻擊所利用。」 。這種解釋更多?..非常感謝 – anevil

+1

這是一種攻擊,當用戶傳遞一個字符串後,以文本方式插入查詢後,查詢功能將以不同的方式表達(例如查詢可能返回結果不應該返回)。在這裏閱讀更多信息:http://en.wikipedia.org/wiki/SQL_injection – Pawel