如何更新表1的ID等于表2的ID的多个sql行

时间:2014-12-04 14:29:09

标签: c# sql-server asp.net-mvc-5

应用程序没有用户输入,也不会在网上发布,因此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");

如果有任何其他信息有用,请在评论中提问,我会尽力提供

1 个答案:

答案 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();
           }
      }
 }