添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

3_20211101CSharpArraySavetoDB调试记录

这是一个窗体应用程序,结合了李工封装的matlab程序。

为了确保找到问题的出处,所以是每一步都有显示

DB先用A_ADD2,再用AA_ACTUALPXB

编辑、调试过程

  • 对比李工的工程文件,怀疑是程序结构的问题
  • 先执行三次 $"insert into A_ADD2 values({PxA[i]},{PxA[i]},{PxA[i]})" ,报错信息如下
  • Oracle表格数据类型
    column1——number
    column2——VARCHAR(20)
    column3——VARCHAR(20) 1(1,2) C#的double[]数据类型与Oracle表格的数据类型不相符 Oracle表格数据类型
    DOUBLE_PRECISION 同上,虽然还报错,但是能存住一行数据
    而且Oracle表格的数据类型变为FLOAT(126)了 C#程序
    if (i == 3)
    {
    SQLString = $"insert into A_ADD2 values({PxA[i]},{PxA[i]},{PxA[i]})";
    DbHelperOra.ExecuteSql(SQLString);
    } 没有保存数据 C#程序
    for循环里啥也没写,数据库操作写在while后面了 没有保存数据 Oracle表格数据类型
    VARCHAR2(126) 存不上,所以VARCHAR2这个类型不行

    托管调试助手 "ContextSwitchDeadlock":“CLR 无法从 COM 上下文 0x9cdc02d0 转换为 COM 上下文 0x9cdc01a8,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。”——你的应用进入了中断状态,但当前未执行任何受选定调试引擎支持的代码(例如,仅在执行本机运行时代码)。

    System.Exception:“ORA-00947: 没有足够的值”

    System.Exception:"ORA-01722: 无效数字"

    System.Exception:“ORA-01741: 非法的零长度标识符”

    System.Exception:“ORA-01722: 无效数字”

    ORA-00902: 无效数据类型

    ORA-06550: 第 3 行, 第 56 列:
    PLS-00103: 出现符号 "I"在需要下列之一时:

    * & = - + ; < / > at in is
    mod remainder not rem return returning <an exponent (**)>
    <> or != or ~= >= <= <> and or like like2 like4 likec between
    into using || multiset bulk member submultiset
    符号 "*在 "I" 继续之前已插入。

  • 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    *Action:
  • Oracle插入数据时显示:ORA-00984列在此处不允许解决方法 | 少将全栈 (whatled.com)
  • C# worksheet设置Excel样式 - 人走茶亦凉 - 博客园 (cnblogs.com)
  • System.Exception:“ORA-00984: 列在此处不允许”问题解决

    基于上述编辑调试过程开始针对此问题的调试

    调试思路是利用A_ADD2表找出问题原因,在用这个表调试好之后在用AA_ACTUALPXB验证。如通过则删除并新建(数据类型为双精度浮点型)其他表

    目前AA_ACTUALPXB和A_ADD2表的数据类型都是双精度浮点型

    (14点49分)新思路,我可以在SQL developer中验证添加进来的值的有效范围——推翻,原因:验证完也不知道VS中matlab的计算结果是什么样的,还是得用matlab计算结果去验证。不行就改matlab程序。

    编辑、调试过程

    SQLString = $"insert into A_ADD2 values({PxA[0]},{PxA[1]},{PxA[2]})";

    无脑参考👇链接1,SQLString = $"insert into A_ADD2 values('{PxA[0]}','{PxA[1]}','{PxA[2]}')";

    SQLString = $"insert into A_ADD2 values({PxA[0]},0,0)";

    能正常运行;

    SQLString = $"insert into A_ADD2 values({PxA[0]},{PxA[0]},0)";

    能正常运行;

    SQLString = $"insert into A_ADD2 values({PxA[0]},{PxA[0]},{PxA[0]})";

    能正常运行;

    SQLString = $"insert into A_ADD2 values({PxA[0]},{PxA[1]},{PxA[0]})";

    报错1;PxA[1]应该是空,excel表格里就是空(对照excel表格发现我说对了)。所以两个方案

      1. 当表格内容为空时约定特殊值(根本的解决方法)
      2. 直接从第二行即第二次计算开始输出(治标不治本,暂时验证行)
      3. 使允许有空项
    

    if (StorageNum > 1) { SQLString = $"insert into A_ADD2 values({PxA[0]},{PxA[1]},{PxA[2]})"; DbHelperOra.ExecuteSql(SQLString); }

    卧槽存上了

    保存到AA_ACTUALPXB试试,依旧套在StorageNum>1 里面

  • 插入数据时显示:ORA-00984列在此处不允许解决方法_Z少年的博客-CSDN博客_列在此处不允许
  • matlab相关部分整合到现有的工程文件中
  • 用多线程完成数据计算和数据库存储
  • matlab虽然能算了但是还有问题
  • 第一次计算有空项待解决
  • 那些表得删了重建,重建的时候记得保存sql文件,避免以后修改一次重写一次
  • 多线程也没写
  • next step

  • 如何使允许有空项

    依然是用A_ADD2来做测试

    编辑、调试过程

    先看看空值的数据类型是啥:

    label24.Text = "空项的数据类型是:" + PxA[1].GetType().ToString();

    在do里写这句话没有用,因为它给出的事最后一次计算式PxA[1]的类型,System.Double

    空值的数据类型是:System.Double,值为:NaN

    $\color{red}{test}$

    $\color{#FF0000}{test}$

    2021年11月5日,09点59分

  • PxA[1]为NaN,用SQLString = $"insert into A_ADD2 values(\" \",{PxA[2]},{PxA[2]})";运行,报错1

    SQLString = $"insert into A_ADD2 values(\"\",{PxA[2]},{PxA[2]})";运行,报错5

    SQLString = $"insert into A_ADD2 values(' ',{PxA[2]},{PxA[2]})";运行,报错6

    经过在SQL developer 中的一顿瞎试,找到了它!

    insert into A_ADD2 values(0.1,0.2,0.3); insert into A_ADD2 values(0.1,0.2); --ORA-00947: 没有足够的值 insert into A_ADD2(column1,column2) values(0.1,0.2); --一行已插入0.1,0.2,(null) insert into A_ADD2 values( ,0.1,0.2) --ORA-00936: 缺失表达式 insert into A_ADD2 values('',0.1,0.2); --一行已插入(null),0.1,0.2 insert into A_ADD2 values(' ',0.1,0.2); --ORA-01722: 无效数字 insert into A_ADD2 values('-',0.1,0.2); --ORA-01722: 无效数字 insert into A_ADD2 values('2',0.1,0.2); --一行已插入2,0.1,0.2 insert into A_ADD2 values("",0.1,0.2); --ORA-01741: 非法的零长度标识符 insert into A_ADD2 values(" ",0.1,0.2); --ORA-00984: 列在此处不允许 insert into A_ADD2 values( ); --ORA-00936: 缺失表达式 insert into A_ADD2 values(0.1, ,0.3); --ORA-00936: 缺失表达式 insert into A_ADD2 values(0.1,'',0.3); --一行已插入0.1,(null),0.3 insert into A_ADD2 values(0.1,' ',0.3); --ORA-01722: 无效数字 insert into A_ADD2 values(0.1,"",0.3); --ORA-01741: 非法的零长度标识符 insert into A_ADD2 values(0.1," ",0.3); --ORA-00984: 列在此处不允许 select * from A_ADD2;

    insert into A_ADD2 values(0.1,'',0.3);

    for (int n = 0; n < PxA.Length; n++) { if (PxA[n] == double.NaN) { PxA[n] = double.Parse("''");//接下来修改的都是这句话 } }

    PxA[n] = (double)' '; 报错1

    PxA[n] = (double)''; 编译报错空字符

    PxA[n] = double.Parse(""); 报错1

    PxA[n] = double.Parse(" "); 报错1

  • begin for i in 50 .. 57 loop execute immediate 'alter table AA_PXA0 add C||i number(9,5)';--之后改这 end loop; end;

    execute immediate 'alter table AA_PXA0 add C||'||i||' number(9,5)'; 报错9

    execute immediate 'alter table AA_PXA0 add C||'i' number(9,5)'; 报错8

  • oracle drop table的用法_Oracle-CSDN博客
  • oracle删除表语句 - 滤v镜 - 博客园 (cnblogs.com)
  • Markdown中如何让# * >等符号原样显示?_haohaoxuexiyai的博客-CSDN博客
  •