如何正确使用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");
}
答案 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 });