1、数据库多表循环更新的思想在这个链接上,标题是“MySql多表循环遍历更新”,
链接地址/litao4047/archive//05/31/3108753.html先看看这个思想,如果你需要这样的思路... ...
2、“利用百度地图Geocoding API获取特定地区或地址的经纬度信息”,这个链接讲的是从百度地图API获取地址解析数据,为数据库表更新提供数据基础。/litao4047/archive//05/30/3107565.html
以上两个链接就是为下面的思路做铺垫的,方便我的讲述。。。
首先,要借用别人的服务,通过别人的服务接口获取自己想要的数据。Geocoding API 是百度提供的服务接口,主要是用于提供从地址解析到经纬度坐标或者从经纬度坐标解析到地址的转换服务。我们今天要说的就是地址解析,通过现有的地址数据解析服务,获取经纬度数据。代码示例如下:
public bool getLatitudeAndLongitude(string city, stringaddress)
{bool flag = true;
WebClient client= new WebClient();//webclient客户端对象
string url = "http://api./geocoder/v2/?ak=2ae1130ce176b453fb29e59a69b18407&callback=renderOption&output=xml&address=" + address + "&city=" +city;
client.Encoding= Encoding.UTF8;//编码格式
string responseTest = client.DownloadString(url);//下载xml响应数据
try{
XmlDocument doc= new XmlDocument();//创建XML文档对象
if (!string.IsNullOrEmpty(responseTest))
{
doc.LoadXml(responseTest);//加载xml字符串
doc.Save(@"F:\更新数据库\UpdataDataBase\UpdataDataBase\Location.xml");
flag= true;
}
}catch(Exception e)
{
flag= false;
}returnflag;
}
上面的代码我就不做具体是介绍了,基本上是从API上获取数据,然后呢,以xml文件格式存储在本地,方便更新的时候从本地读取数据。。
第二,就是读取上面存储的xml文件格式的数据,写个方法(传的参数是xml文件路径),将经纬度这两个数据存储在数组里面,返回数组。
//获取默认主页的数据
internal static string[] getDBInfo(stringpath)
{try{string[] _data = new string[2];
XmlDocument xmldoc= newXmlDocument();
xmldoc.Load(path);
XmlNodeList xnRoot= xmldoc.SelectNodes("/GeocoderSearchResponse/result/location");foreach (XmlNode node inxnRoot)
{
_data[0] = node.SelectSingleNode("lat").InnerXml.ToString();
_data[1] = node.SelectSingleNode("lng").InnerXml.ToString();
}return_data;
}catch(Exception settingEx)
{return null;
}
}
第三,获取到数据之后,建一个Model类
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceUpdataDataBase
{//数据模型,存放数据
public classDataModel
{private stringid;public stringId
{get { returnid; }set { id =value; }
}private stringcity;private stringaddress;private decimallatitude;private decimallongitude;public stringCity
{get { returncity; }set { city =value; }
}public stringAddress
{get { returnaddress; }set { address =value; }
}public decimalLatitude
{get { returnlatitude; }set { latitude =value; }
}public decimalLongitude
{get { returnlongitude; }set { longitude =value; }
}
}
}
Data Model类
第四,连接数据库,以city,adress来查询数据(传参表名)
private static List GetDataConn(stringdataTable)
{
List dataSource = new List();using (MySqlConnection conn = newMySqlConnection(MySqlString))
{string MySqlSelect = "select id,city,address,latitude,longitude from" +dataTable;
MySqlCommand Command= newMySqlCommand(MySqlSelect, conn);
conn.Open();using (MySqlDataReader dataReader =Command.ExecuteReader())
{while(dataReader.Read())
{
DataModel dataModel= newDataModel();
dataModel.Id= dataReader["id"].ToString();
dataModel.City= (string)dataReader["city"];
dataModel.Address= (string)dataReader["address"];if (dataReader["latitude"] !=DBNull.Value)
{
dataModel.Latitude= (decimal)dataReader["latitude"];
}elsedataModel.Latitude= 0.0M;if (dataReader["longitude"] !=DBNull.Value)
{
dataModel.Latitude= (decimal)dataReader["longitude"];
}elsedataModel.Latitude= 0.0M;
dataSource.Add(dataModel);
}
dataReader.Close();
dataReader.Dispose();
}
conn.Close();
conn.Dispose();
}returndataSource;
}
连接数据库,查找数据
第五,更新方法(传四个参数) ,如下:
private static void UpdataDataBase(string id, string dataTable, decimal lat, decimallng)
{using (MySqlConnection conn = newMySqlConnection(MySqlString))
{string MySqlUpdata = "update" + dataTable + "set latitude=" + lat + ",longitude=" + lng + "where id=" +id;
MySqlCommand Command= newMySqlCommand(MySqlUpdata, conn);
conn.Open();
Command.ExecuteNonQuery();
conn.Close();
conn.Dispose();
}
}
最后,就是在Main()方法中调用,这个非常关键,提醒一点就是必须要做异常处理,否则将出现很多问题....
static void Main(string[] args)
{string[] tableName = new string[19];
tableName[0] = "data_abroadstudy_agency_info";
tableName[1] = "data_bank_atm";
tableName[2] = "data_car_repair";
tableName[3] = "data_childrenschool_info";
tableName[4] = "data_college_info";
tableName[5] = "data_daijia";
tableName[6] = "data_gasstation";
tableName[7] = "data_government_service_point";
tableName[8] = "data_highschool_info";
tableName[9] = "data_highway_service_station";
tableName[10] = "data_housecare_service_info";
tableName[11] = "data_juniorschool_info";
tableName[12] = "data_lawyer_service_info";
tableName[13] = "data_parkyard";
tableName[14] = "data_pet_hostpital";
tableName[15] = "data_pharmacy_info";
tableName[16] = "data_secondhand_car";
tableName[17] = "data_shopingmall_info";
tableName[18] = "data_train_plane_tickets_daishou";
GetLatitudeAndLongitude getLatLng= newGetLatitudeAndLongitude();int i = 0;for (i = 0; i < tableName.Length; i++)
{
List DataSource = new List();int h = 0;
DataSource=GetDataConn(tableName[i]);foreach (DataModel dm inDataSource)
{bool flag = false;string[] info = new string[2];
flag=getLatLng.getLatitudeAndLongitude(dm.City, dm.Address);try{if(flag)
{
info= XMLSettings.getDBInfo(@"F:\更新数据库\UpdataDataBase\UpdataDataBase\Location.xml");if (info[0].Length > 10)
dm.Latitude= Convert.ToDecimal(info[0].Substring(0, 10));else if (info[0].Length == 0)continue;elsedm.Latitude= decimal.Parse(info[0]);if (info[1].Length > 10)
dm.Longitude= Convert.ToDecimal(info[1].Substring(0, 10));elsedm.Longitude= Convert.ToDecimal(info[1]);
UpdataDataBase(dm.Id, tableName[i], dm.Latitude, dm.Longitude);
Console.WriteLine("第" + h + "条记录以更新");
h++;
}
}catch(Exception ex)
{continue;
}
}
Console.WriteLine(tableName[i]+ "此表已更新完毕!!!");
}
}
写到这,也算是结束了。毕竟也有很多不足之处,如果大家能够用到,就好好改善改善...
mysql geocode_百度地图Geocoding API获取特定地区或地址的经纬度信息 然后在MySql数据库多表循环遍历更新...