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

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

相关推荐
ss27314 小时前
食谱推荐系统功能测试如何写?
java·数据库·spring boot·功能测试
l1t14 小时前
DeepSeek总结的数据库外部表
数据库
m0_6742946414 小时前
如何编写SQL存储过程性能对比_记录执行时间评估优化效果
jvm·数据库·python
014-code14 小时前
CompletableFuture 实战模板(超时、组合、异常链处理)
java·数据库
运气好好的14 小时前
怎样开启phpMyAdmin的操作审计日志_记录每条执行的SQL
jvm·数据库·python
それども15 小时前
DELETE 和 TRUNCATE TABLE区别
java·数据库·mysql
wenha15 小时前
数据库隔离级别
数据库·mysql·sqlserver·隔离级别
2401_8714928515 小时前
Layui如何修改Layui默认的UI主题颜色(换肤功能实现)
jvm·数据库·python
Edward1111111116 小时前
4.27mysql ,数据库,数据源
数据库·mysql
小徐敲java16 小时前
踩坑实录:MySQL8.0 导入SQL报错 2006 - MySQL server has gone away 完美解决
数据库·sql