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

场景为字符串长度超过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格式数据的处理流程相同,只是读取数据的步骤超有差异。

相关推荐
数智化管理手记5 小时前
精益生产中的TPM管理是什么?一文破解设备零故障的密码
服务器·网络·数据库·低代码·制造·源代码管理·精益工程
翊谦6 小时前
Java Agent开发 Milvus 向量数据库安装
java·数据库·milvus
難釋懷7 小时前
OpenResty实现Redis查询
数据库·redis·openresty
别抢我的锅包肉7 小时前
【MySQL】第四节 - 多表查询、多表关系全解析
数据库·mysql·datagrip
Database_Cool_7 小时前
OpenClaw-Observability:基于 DuckDB 构建 OpenClaw 的全链路可观测体系
数据库·阿里云·ai
刘~浪地球7 小时前
Redis 从入门到精通(五):哈希操作详解
数据库·redis·哈希算法
zzh0818 小时前
MySQL高可用集群笔记
数据库·笔记·mysql
Shely20178 小时前
MySQL数据表管理
数据库·mysql
爬山算法8 小时前
MongoDB(80)如何在MongoDB中使用多文档事务?
数据库·python·mongodb
APguantou9 小时前
NCRE-三级数据库技术-第2章-需求分析
数据库·需求分析