超长文本格式坐标串数据空间化入库

场景为字符串长度超过4000,无法在数据库内单独处理,需结合编程工具如C#编程读取文本/EXCEL数据,用于将格式如下的数据做空间化入库。

复制代码
1:POLYGON((12.0041696,22.4982501,12.7017899999999,22.0981097,12.9995904,22.49800979999997,......))

以下是数据库端存储过程:

sql 复制代码
CREATE OR REPLACE PROCEDURE PROC_UPDATE_POLYGON(OBJECTID IN INTEGER,POLYTEXT IN CLOB,res out number)
IS
   GEOM SDE.ST_GEOMETRY;
BEGIN
   res :=0;
   --GEOM:=SDE.ST_POLYFROMTEXT(POLYTEXT,2);
   GEOM:=SDE.st_geomfromtext (POLYTEXT,2);
   
   --INSERT INTO GRID (OBJECTID,SHAPE) VALUES(OBJECTID,GEOM);
   update GRID t set t.shape=GEOM WHERE id=OBJECTID AND SHAPE IS NULL;
   res := SQL%ROWCOUNT;
END PROC_UPDATE_POLYGON;

以下是文本格式数据处理的C#主要代码:

cs 复制代码
private void UPDATE_POLYGON()
{
    string filePath = textBox1.Text;
 
    try
    {
        string[] lines = File.ReadAllLines(filePath);
        richTextBox1.AppendText("总行数:" + lines.Length.ToString() + Environment.NewLine);
        btnstart.Enabled = btnopenfile.Enabled = false;
        oracle ora = new oracle();
 
        int line_total = lines.Length;
        int line_id = 1;
        int success = 0;
        int error = 0;
        foreach (string line in lines)
        {
            //Console.WriteLine(line);
            // 在此处可以对每一行的内容进行处理
            string[] colsval = line.Split(':'); int id = int.Parse(colsval[3]);
            string text1 = colsval[0];
            string text2 = colsval[1];
 
            string procname = "PROC_UPDATE_POLYGON";
            OracleParameter[] pars = {
                    new OracleParameter("OBJECTID", OracleDbType.Int32),
                    new OracleParameter("POLYTEXT", OracleDbType.Clob),
                    new OracleParameter("res", OracleDbType.Int32),
                };
            pars[0].Value = id;
            pars[0].Direction = ParameterDirection.Input;
            pars[1].Value = text1;
            pars[1].Direction = ParameterDirection.Input;
            
            pars[2].Value = 0;
            pars[2].Direction = ParameterDirection.Output;
 
            int res1=ora.ExecProc(procname, pars);
            int res = Int32.Parse(pars[4].Value.ToString());
            if (res1 == -2)
            {
                error++;
                Console.WriteLine(line);
                string[] zbstr = text1.Split(',');
                string[] zbstrnew = new string[zbstr.Length];
                for (int i = 0;i<zbstr.Length;i++)
                {
                    string[] z = zbstr[i].Split(' ');
                    for (int j = 0;j<z.Length;j++)
                    {
                        if (!z[j].Contains(".")) continue;
                        int pos1 = z[j].IndexOf(".");
                        int pos2 = z[j].Substring(z[j].IndexOf(".")).Length;
                        
                        if (pos2 >= 8)
                            z[j] = z[j].Substring(0, pos1 + 8);
                        else
                            ;
 
                    }
                    zbstrnew[i] = string.Join(" ", z);
                }
 
                pars[1].Value = string.Join(",", zbstrnew);
                res1 = ora.ExecProc(procname, pars);
                res = Int32.Parse(pars[4].Value.ToString());
            }
            else if (res > 0)
                success++;
 
            richTextBox1.AppendText(line_id.ToString() + "/" + line_total + ":::ID:" + id.ToString() + ":::RES:" + res + Environment.NewLine);
            Thread.Sleep(10);
            line_id++;
        }
        richTextBox1.AppendText("total:"+ line_total + ":::success:" + success+ ":::error:" + error + Environment.NewLine);
 
    }
    catch (Exception ex)
    {
        Console.WriteLine("文件读取出错:" + ex.Message);
    }
    btnstart.Enabled = btnopenfile.Enabled = true;
}
 
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procname">存储过程名称</param>
/// <param name="parameters">存储过程参数</param>
/// <returns></returns>
public int ExecProc(string procname, OracleParameter[] parameters)
{
    OracleConnection conn = OpenConn();
    if (conn == null) { return -1; }
    try
    {
        var cmd = conn.CreateCommand();
        if (parameters != null)
        {
            // 添加参数
            cmd.Parameters.AddRange(parameters);
        }
 
        conn.Open();
        cmd.CommandText = procname;
        cmd.CommandType = CommandType.StoredProcedure;
        return cmd.ExecuteNonQuery();
    }
    catch (Exception e)
    {
        ;
        //throw new Exception(e.Message);
        //MessageBox.Show(e.Message);
        Console.WriteLine(e.Message);
        Console.WriteLine("ERROR:" + parameters[0].Value);
        return -2;
    }
    finally { CloseConn(conn); }
}

excel格式数据的处理流程相同,只是读取数据的步骤超有差异。

相关推荐
七七powerful2 小时前
养龙虾-在 Grafana 中获取 API Token 的方法
数据库
阿坤带你走近大数据2 小时前
Oracle存储过程怎么写
数据库·oracle·存储过程
搜佛说2 小时前
第2章-EdgeX-Foundry架构深度解析
数据库·物联网·架构·边缘计算·iot
知识分享小能手2 小时前
PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 服务器配置与数据库监控终极指南 —语法、案例与实战(18)
数据库·学习·postgresql
珠海西格电力2 小时前
零碳园区全面感知体系的建设成本和收益分析包含哪些关键数据?
大数据·数据库·人工智能·智慧城市·能源
天空属于哈夫克32 小时前
私域自动化:构建企业微信全链路无人值守运营体系
数据库
wangjinxun2 小时前
【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库
数据库·mysql·数据库开发
sa100272 小时前
获取京东评论api接口
数据库
l1t2 小时前
直接case when 聚合和先聚合后case when在duckdb150和sqlite3.52的性能比较
数据库·sqlite·duckdb