Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库

注意:因为前面的文章中已经使用python实现了,因此在这里有一部分是相同的,主要不同是代码方面,大家可以参考一下

一、上传地理位置数据的文件并将文件中的数据存入数据库中

(1)数据文件内容

包括省份、所在市区县、具体位置名称
Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第1张图片

(2)文件上传并存入数据库

先在数据库中建表,如下所示:
Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第2张图片
注意设置主键Id和自增标识:
Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第3张图片
撰写文件上传代码,其中里面有很多注意事项,比如限制上传文件类型、文件大小、解决上传文件名冲突等:

    [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用户名
Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第4张图片

(3)保存在数据库中的结果

Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第5张图片

二、请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库

(1)首先打开百度地图开发平台网址,进行注册登录(为后面获取请请求参数AK做准备):https://lbs.baidu.com/faq/api?title=webapi/guide/webservice-geocoding-base,再点击地理编码,如下图所示:

Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第6张图片
这里面包括了请求api接口说明,使用说明,请求参数,示例代码等详细说明,如下所示:
Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第7张图片
大家需要参考说明进行数据请求,下面是我实现的代码:
这是我建立的表来保存请求获得的数据:
Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第8张图片

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

(2)保存在数据库中的结果

Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第9张图片

三、获取的坐标数据在百度地图中的拾取坐标系统进行验证

url地址:https://api.map.baidu.com/lbsapi/getpoint/index.html
对浙江省人民医院坐标位置进行反查验证:
Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第10张图片
Asp.net (C#)实现上传文件到指定位置保存并将文件数据存入数据库,同时请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库_第11张图片
发现反查的结果和数据是一致,说明数据信息是正确的!

大家可以参考代码,我会将代码资源上传,大家可以进行下载,里面还有一些其它代码!

你可能感兴趣的:(asp.net,c#,数据库)