Arrays 带有int数组参数的EF ExecuteSqlCommand
我在尝试传递int类型数组的参数时遇到了一个问题。到目前为止,我所做的工作如下,但两种方法都失败了 方法1(失败):Arrays 带有int数组参数的EF ExecuteSqlCommand,arrays,entity-framework,asp.net-mvc-4,Arrays,Entity Framework,Asp.net Mvc 4,我在尝试传递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.Execute
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);
db.Database.ExecuteSqlCommand("delete from SupportRegion where UserId={0} and CategoryID not in ({1})", userItem.UserId, String.Join(",", userItem.ListItemId));
方法2(也失败):
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);
db.Database.ExecuteSqlCommand("delete from SupportRegion where UserId={0} and CategoryID not in ({1})", userItem.UserId, String.Join(",", userItem.ListItemId));
如何将参数定义为整数数组
非常感谢第一种情况不起作用,因为数据库不理解int数组的含义。我不知道第二个示例中的“失败”是什么意思,但我认为Sql Server无法将字符串转换为int。我相信服务器端正在发生的事情是将查询转换为如下内容(请注意引号): 因为您要传递的参数是字符串。但是CategoryID列不是字符串,传递的参数不能转换为int 我认为您可以尝试使用一个表值参数,但它看起来有点难看 根据要删除的实体数量,最安全的方法可能是将实体带到客户端,将要删除的实体标记为已删除并调用SaveChanges() 另一个解决方法是正确设置命令文本(请参阅下面的免责声明): 通过这种方式,string.format调用应该将INT列表嵌入为文本,然后将其传递给负责用户id的ExecuteSqlCommand方法 免责声明
Sql注入攻击可以利用上述方法如果您不控制用于生成要删除的ID列表的数据源,请不要使用它。一般来说,我建议不要使用这种方法,除非你真的知道它是如何使用的,并且你确信没有什么不好的事情发生(你真的不可能…Hi Mr@Pawel.。方法2失败的原因与你在方法1中解释的相同:-)。我对EF和Web编程基本上是新手,所以我不太理解“上面的方法可能被Sql注入攻击利用”。这是一种攻击,当用户传递一个字符串,该字符串在以文本方式插入查询后,使查询函数以不同的方式运行(例如,查询可能返回它不应该返回的结果)。请在此处阅读更多内容:由于您使用string.format将值插入sql字符串,因此这不容易受到sql注入的影响吗?响应中对此有免责声明。