注意:因为前面的文章中已经使用python实现了,因此在这里有一部分是相同的,主要不同是代码方面,大家可以参考一下
先在数据库中建表,如下所示:
注意设置主键Id和自增标识:
撰写文件上传代码,其中里面有很多注意事项,比如限制上传文件类型、文件大小、解决上传文件名冲突等:
[WebMethod(Description = "文件上传与请求百度地理坐标数据存入数据库中", EnableSession = true)]
public string UploadFile()
{
string result = string.Empty;
try
{
string uploadFolder = "XXXX"; // 文件上传的保存路径
string fileName = HttpContext.Current.Request.Files[0].FileName; //获取上传文件的名称
Stream stream = HttpContext.Current.Request.Files[0].InputStream;
if ( (fileName.Split('.')[1].ToString()!="xlsx") && (fileName.Split('.')[1].ToString() != "xls") ) //判断上传文件格式是否符合要求
{
return "上传文件类型不符合xlsx、xls";
}
if (fileName.Length > 20*1024*1024) //判断上传文件大小是否符合要求
{
return "上传文件大小超过了最大限制(20M)";
}
string stri = "abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ";
Random ran = new Random();
//实现从a-z,A-Z中随机选择一个字母
int n = ran.Next(1, 41);
DirectoryInfo root = new DirectoryInfo(uploadFolder); // 获取上传地址文件夹里面的所有文件名
foreach (FileInfo f in root.GetFiles()) // 判断上传文件名称是否重复
{
if (fileName == f.Name)
{
fileName = fileName.Split('.')[0] + System.DateTime.Now.ToString("D").ToString() + stri[n] + "." + fileName.Split('.')[1]; //如果上传文件名称重复,对保存的文件重命名(重命名规则:原名称+当前日期+42个大小写英文字母随机抽取一个组合)
break;
}
else
{
continue;
}
}
//保存上传文件到指定位置
string savePath = System.IO.Path.Combine(uploadFolder, fileName);
FileStream fsWrite = new FileStream(savePath, FileMode.Create);
byte[] bytes = new byte[1024 * 4];
int total = 0;
int size = 0;
do
{
//注意第二个参数是在buffer中的偏移量,不是在文件中的偏移量
size = stream.Read(bytes, 0, bytes.Length);
fsWrite.Write(bytes, 0, size);
total += size;
} while (size > 0);
fsWrite.Close();
//读取上传文件的数据信息
OleDbConnection ole = null;
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + uploadFolder + fileName + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1';";
ole = new OleDbConnection(strConn);
ole.Open();
string sql = "select * from [Sheet1$]";
OleDbDataAdapter oleExcel = new OleDbDataAdapter(sql, ole);
DataSet dsExcel = new DataSet();
oleExcel.Fill(dsExcel, "Sheet1");
DataTable tb = dsExcel.Tables["Sheet1"];
var L1 = new List<object>();
//循环遍历数据
for (int i = 0;i< tb.Rows.Count;i++)
{
string userinfo = "";
//获取医院名称
userinfo += tb.Rows[i]["省份"].ToString() + tb.Rows[i]["地级市"].ToString() + tb.Rows[i]["县/区"].ToString() + tb.Rows[i]["医院名称"].ToString();
//将医院名称存入一个List里面,并剔除重复名称的医院
if (L1.Contains(userinfo))
{
continue;
}
else
{
L1.Add(userinfo);
//判断表中是否已经存在该医院相关的数据
string HospSql = "select count(*) from XXXX where Address = '" + userinfo + "' ";
int HospCou = int.Parse(SqlDatas.SelctData(HospSql));
if (HospCou > 0)
{
continue;
}
else
{
//get请求 百度地理 里面 医院的坐标位置数据
string HospitalAddress = "https://api.map.baidu.com/geocoding/v3/?address=" + userinfo + "&output=json&ak=XXXX";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(HospitalAddress);
request.Method = "GET";
request.ContentType = "textml;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string jsonData = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
string jsonString = jsonData;
JObject json = JObject.Parse(jsonString);
string Lng = json["result"]["location"]["lng"].ToString();
string Lat = json["result"]["location"]["lat"].ToString();
//将获取的医院位置数据存入表中
string SearchStr = @" insert into XXXX(Address,Lng,Lat,InsertTime)"
+ @" values( @Address,@Lng,@Lat,@InsertTime)";
SqlParameter[] para = new SqlParameter[]
{
new SqlParameter("@Address", userinfo )
,new SqlParameter("@Lng", Lng )
,new SqlParameter("@Lat", Lat )
,new SqlParameter("@InsertTime", DateTime.Now)
};
int RowCount = SqlHelper.ExecuteNonQuery(CommandType.Text, SearchStr, para);
}
}
}
ole.Close();
result = fileName + "文件上传成功 并 成功将数据写入数据库!";
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}
其中在插入数据的过程中报了一些错误,如:There are fewer columns in the INSERT statement than values specified in the VALUES clause 、229, b"The SELECT permission was denied on the object ‘HospitalZb’,这些都是数据库连接的用户username对表没有select和insert的权限,因此需要在数据库中执行以下命令:
GRANT select ON HospitalZb TO sx – select赋予的权限 HospitalZb表面 sx用户名
这里面包括了请求api接口说明,使用说明,请求参数,示例代码等详细说明,如下所示:
大家需要参考说明进行数据请求,下面是我实现的代码:
这是我建立的表来保存请求获得的数据:
string HospitalAddress = "https://api.map.baidu.com/geocoding/v3/?address=" + userinfo + "&output=json&ak=XXXXX";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(HospitalAddress);
request.Method = "GET";
request.ContentType = "textml;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
string jsonData = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
string jsonString = jsonData;
JObject json = JObject.Parse(jsonString);
string Lng = json["result"]["location"]["lng"].ToString();
string Lat = json["result"]["location"]["lat"].ToString();
//将获取的医院位置数据存入表中
string SearchStr = @" insert into XXXX(Address,Lng,Lat,InsertTime)"
+ @" values( @Address,@Lng,@Lat,@InsertTime)";
SqlParameter[] para = new SqlParameter[]
{
new SqlParameter("@Address", userinfo )
,new SqlParameter("@Lng", Lng )
,new SqlParameter("@Lat", Lat )
,new SqlParameter("@InsertTime", DateTime.Now)
};
int RowCount = SqlHelper.ExecuteNonQuery(CommandType.Text, SearchStr, para);
url地址:https://api.map.baidu.com/lbsapi/getpoint/index.html
对浙江省人民医院坐标位置进行反查验证:
发现反查的结果和数据是一致,说明数据信息是正确的!
大家可以参考代码,我会将代码资源上传,大家可以进行下载,里面还有一些其它代码!