2014-12-04 98 views
0

应用程序有没有用户输入的,也不会是活在网络上,所以SQL注入是不是威胁如何更新多个SQL行,其中表1的ID等于表2的ID

我的应用程序

此应用程序应该从1个表格向Google地理编码器API发送多个地址,并将返回的纬度和经度存储在第二个表格中供以后使用。API每天最多可以处理2500个请求。

问题是什么

当我运行我的程序,没有limmits,只有几排(约20),获得更新出来,都应该得到更新2500行。当我限制我的程序只更新10行以避免触及API限制时,不会发生任何更改。我允许2500次请求时更新的大部分行都使用正确的值进行更新(除了少数几个之外),现在我不担心这一点,我认为这只是地理编码器的糟糕结果。

我有什么到目前为止

我有2串strLat和strLong持有从谷歌地理编码API检索lattitudes和经度。

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列,然后地址被分解等地址,城市,ST,ZIP ... ETC,表2持有纬度和经度,并且具有相同的等值的同一个ADDRESS_ID表,目前大部分的lats和lng都是0.00,它是十进制的。

表1

| --PKid-- | ADDRESS_ID |地址| CITY ..等
| 124246 | 70-00002913 | 112 bill st。 |鲍勃镇

表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"); 

如果任何其他信息将是有益的,请简单地问了意见,我会尽我所能提供

+1

我不是其所以然清楚,你不知道该怎么在这里做?它在UPDATE中使用JOIN吗? – 2014-12-04 14:32:56

+4

你好SQL注入 – 2014-12-04 14:33:28

+0

我需要能够更新表2中的行与正确的纬度和经度与表1中相同的ID相匹配 – RyeNyeTheComputerScienceGuy 2014-12-04 14:34:18

回答

1

它看起来像你的地方条件定义不正确。您正在发送,其中以下:

"WHERE'" + row.ADDRESS_ID + " = '" + row1.ADDRESS_ID + "' 

这基本上是对海誓山盟比较实际ID值。我相信,你需要修改你的查询如下:

string strQueryUpdate = "UPDATE TABLE2 SET Lat = " + strLat + ", Lng = " + strLong + 
     " WHERE ADDRESS_ID='" + row.ADDRESS_ID + "'"; 

UPDATE

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(); 
      } 
     } 
} 
+0

我应该知道这一个,但不幸的是它仍然没有解决这个问题,我的行仍然没有更新与拉特和lngs。 – RyeNyeTheComputerScienceGuy 2014-12-05 14:30:00

+1

您是否可以确认表1中的每个address_id在表2中都有相同的address_id对应的记录? – mreyeros 2014-12-05 14:32:03

+0

是的,我可以证实这一点。 100%确定。 ID的起始位置为70-00002913,然后依次递增1,直到70-00005528 – RyeNyeTheComputerScienceGuy 2014-12-05 14:35:19

相关问题