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

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

相关推荐
程序员清风11 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
正在走向自律12 小时前
数据集成产品的技术底座:从日志解析原理到 KFS 同步链路搭建(含建表与增删改查完整代码)
数据库·oracle·信创·数据集成·国产数据库·kingbasees·全量+增量同步
程序员塔塔喵12 小时前
【MySQL篇|第七篇】MySQL事务
数据库·mysql·mysql事务
淡海水12 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
独隅13 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
_孤傲_13 小时前
快速掌握 MySQL 语法
数据库·后端·mysql
吴可可12315 小时前
C#调用摄像头拍照的三种API方案
c#
数字新视界15 小时前
一体化机柜在数据中心运维中的创新应用与优势分析
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
SelectDB15 小时前
从 StarRocks 走向 Apache Doris:如何实现引擎平滑替换与架构升级?
大数据·数据库·数据分析
为思念酝酿的痛15 小时前
MySQL的操作
数据库·mysql