Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 带有int数组参数的EF ExecuteSqlCommand_Arrays_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

Arrays 带有int数组参数的EF ExecuteSqlCommand

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类型数组的参数时遇到了一个问题。到目前为止,我所做的工作如下,但两种方法都失败了

方法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);
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注入的影响吗?响应中对此有免责声明。