应用程序没有用户输入,也不会在网上发布,因此sql注入不是威胁
我的申请
此应用程序应该将1个表格中的多个地址发送到Google的地理编码器API,并将返回的纬度和经度存储在第二个表格中供以后使用.API每天最多有2500个请求。
问题是什么
当我运行没有限制的程序时,只有少数行(大约20行)从2500行中更新,这些行应该更新。当我将程序限制为仅更新10行以避免达到API限制时,不会发生任何更改。当我允许2500个请求时更新的大多数行都会使用正确的值进行更新,除了少数几个,我现在不要担心,我认为这些只是来自地理编码器的错误结果。
到目前为止我有什么
我有2个字符串strLat和strLong,用于保存从谷歌地理编码器API检索的晶格和经度。
string strLat = myCoordenates.Results[3].Geometry.Location.Lat.ToString();
string strLong = myCoordenates.Results[3].Geometry.Location.Lng.ToString();
我也尝试用它们更新我的数据库。这已被多次更改和操作,我认为问题可能与我的代码的这部分有关。
using (SqlConnection myConnection = new SqlConnection(context))
{
myConnection.Open();
string strQueryUpdate = "UPDATE WEB_ARENA_GEO SET Lat = '" + strLat + "', Lng = '" + strLong + "'" + "WHERE ARENA_ID='" + row.ARENA_ID + "'";
SqlCommand myCommandUpdate = new SqlCommand(strQueryUpdate, myConnection);
myCommandUpdate.ExecuteNonQuery();
}
在我的数据库表1中保存了具有Pk ID的地址数据以及名为ADDRESS_ID的列,然后地址被分解为ADDRESS,CITY,ST,ZIP ... ETC,表2包含纬度和经度也有相同的ADDRESS_ID表具有相同的相等值,目前大多数的lats和lng都是0.00,它的类型是十进制。
表1
| --PKid-- | ADDRESS_ID |地址| CITY..etc
| 124246 | 70-00002913 | 112法案|鲍勃镇
表2
| ADDRESS_ID | Lat | Lng |
| 70-00002913 | 0.00 | 0.00 |
整个更新控制器
//GET: /TABLE2/Update/
public ActionResult Update(string id)
{
IEnumerable<TABLE1> table1 = db.TABLE1;
IEnumerable<TABLE2> table2 = db.TABLE2;
string context = "my database context here";
foreach (var row in table1.AsEnumerable().Take(10))
{
string strAddr = row.ADDRESS + "," + row.CITY + "," + row.ZIP + "," + row.COUNTRY;
GoogleMapsDll.GeoResponse myCoordenates = new GoogleMapsDll.GeoResponse();
myCoordenates = GoogleMapsDll.GoogleMaps.GetGeoCodedResults(strAddr);
if (myCoordenates.Results != null && myCoordenates.Results.Length > 3)
{
string strLat = myCoordenates.Results[3].Geometry.Location.Lat.ToString();
string strLong = myCoordenates.Results[3].Geometry.Location.Lng.ToString();
using (SqlConnection myConnection = new SqlConnection(context))
{
myConnection.Open();
string strQueryUpdate = "UPDATE WEB_ARENA_GEO SET Lat = '" + strLat + "', Lng = '" + strLong + "'" + "WHERE ADDRESS_ID='" + row.ADDRESS_ID + "'";
SqlCommand myCommandUpdate = new SqlCommand(strQueryUpdate, myConnection);
myCommandUpdate.ExecuteNonQuery();
}
db.SaveChanges();
}
}
return RedirectToAction("Index");
如果有任何其他信息有用,请在评论中提问,我会尽力提供
答案 0 :(得分:1)
看起来你的条件定义不正确。您目前正在发送以下内容:
"WHERE'" + row.ADDRESS_ID + " = '" + row1.ADDRESS_ID + "'
这基本上是将实际的id值与彼此进行比较。我相信您需要修改您的查询,如下所示:
string strQueryUpdate = "UPDATE TABLE2 SET Lat = " + strLat + ", Lng = " + strLong +
" WHERE ADDRESS_ID='" + row.ADDRESS_ID + "'";
<强>更新强>
var pageSize = 10;
var totalPages = Math.Ceiling(table1.Count() / pageSize);
for(var i = 0; i < totalPages; i++) {
var addressesToProcess = table1.Skip(i * pageSize).Take(pageSize);
foreach (var address in addressesToProcess)
{
string strAddr = address.ADDRESS + "," + address.CITY + "," + address.ZIP + "," + address.COUNTRY;
GoogleMapsDll.GeoResponse myCoordenates = new GoogleMapsDll.GeoResponse();
myCoordenates = GoogleMapsDll.GoogleMaps.GetGeoCodedResults(strAddr);
if (myCoordenates.Results != null && myCoordenates.Results.Length > 3)
{
string strLat = myCoordenates.Results[3].Geometry.Location.Lat.ToString();
string strLong = myCoordenates.Results[3].Geometry.Location.Lng.ToString();
using (SqlConnection myConnection = new SqlConnection(context))
{
myConnection.Open();
string strQueryUpdate = "UPDATE WEB_ARENA_GEO SET Lat = '" + strLat + "', Lng = '" + strLong + "'" + "WHERE ADDRESS_ID='" + address.ADDRESS_ID + "'";
SqlCommand myCommandUpdate = new SqlCommand(strQueryUpdate, myConnection);
myCommandUpdate.ExecuteNonQuery();
}
db.SaveChanges();
}
}
}