如何正确使用ExecuteQuery方法?

时间:2015-10-16 14:33:14

标签: c# linq

如何正确使用ExecuteQuery方法?

尝试保存编辑时,我收到以下信息。

  

类型' System.NotSupportedException'的例外情况发生在System.Data.Linq.dll中但未在用户代码中处理

     

其他信息:查询参数的类型不能为'<> f__AnonymousType1`2 [System.String,System.Int32]'。

    [HttpPost]
    [ValidateAntiForgeryToken]

    public ActionResult UpdateRegion()
    {
        AtlasDataContext db = new AtlasDataContext();

        var CurrRegionName = Request.Form["RegionName"];
        var CurrRegionID = Convert.ToInt32(Request.Form["RegionID"]);

        string UpdateQuery = "update Regions set RegionName = '"+CurrRegionName+"' where RegionID = "+CurrRegionID+"";

        db.ExecuteQuery<string>(UpdateQuery, new { CurrRegionName, CurrRegionID });

        return RedirectToAction("Admin");
    }

1 个答案:

答案 0 :(得分:4)

正如您在documentation中看到的那样,ExecuteQuery方法需要两个参数 - 第一个是查询本身,第二个是包含参数的object[]。但是,您不是传递数组,而是传递包含两个属性的匿名对象。传递数组的方法是:

db.ExecuteQuery<string>(UpdateQuery, new object[] {CurrRegionName, CurrRegionId});

<强>然而

这不是您的代码的主要问题。问题是您实际上没有将参数化查询传递给DB。当您构建查询时,您使用字符串连接来创建SQL,并且您将参数值嵌入到字符串本身中,这是一个巨大的安全风险,并且忽略了参数化查询。

正如您在示例here中看到的,您的代码应为:

 string UpdateQuery = "update Regions set RegionName = {0} where RegionID = {1}";
 db.ExecuteQuery<string>(UpdateQuery, new object[] { CurrRegionName, CurrRegionID });