目录



3_20211101CSharpArraySavetoDB调试记录

说明

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

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

DB先用A_ADD2,再用AA_ACTUALPXB

编辑、调试过程

  1. 对比李工的工程文件,怀疑是程序结构的问题
  2. 先执行三次$"insert into A_ADD2 values({PxA[i]},{PxA[i]},{PxA[i]})",报错信息如下

编号

更改内容

报错信息

(参考链接)

原因及说明

1

Oracle表格数据类型

column1——number

column2——VARCHAR(20)

column3——VARCHAR(20)

1(1,2)

C#的double[]数据类型与Oracle表格的数据类型不相符

2

Oracle表格数据类型

DOUBLE_PRECISION

同上

同上,虽然还报错,但是能存住一行数据

而且Oracle表格的数据类型变为FLOAT(126)了

3

C#程序

if (i == 3)

{

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

DbHelperOra.ExecuteSql(SQLString);

}

2

没有保存数据

4

C#程序

for循环里啥也没写,数据库操作写在while后面了

2

没有保存数据

5

Oracle表格数据类型

VARCHAR2(126)

1

存不上,所以VARCHAR2这个类型不行

  • 如果是数据类型的问题,那之前应该存不上
  • 如果不是数据类型的问题,那应该是C#数据的数据类型有问题,而不是Oracle表格设置的数据类型
  • 当C#给定value的值有空项时,报错信息为3。所以当报错为1时,不可能是有空项的原因。
    也就是说,VS向Oracle表中存数据不允许有空项。怎么能让它允许空项呢?
  • 由于当value中的值是常数时,可以正常存储,所以当下应该解决报错1(13点59分)。另起标题。

报错列表

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

参考链接

  1. ​Oracle插入数据时显示:ORA-00984列在此处不允许解决方法 | 少将全栈 (whatled.com)​
  2. ​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;
  • 无脑参考????链接1,SQLString = $"insert into A_ADD2 values('{PxA[0]}','{PxA[1]}','{PxA[2]}')";
    报错4;
  • 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 里面
    OKK了

参考链接

  1. ​插入数据时显示:ORA-00984列在此处不允许解决方法_Z少年的博客-CSDN博客_列在此处不允许​

现状总结

目标

  • matlab相关部分整合到现有的工程文件中
  • 用多线程完成数据计算和数据库存储

现状

  • matlab虽然能算了但是还有问题
  • 第一次计算有空项待解决
  • 那些表得删了重建,重建的时候记得保存sql文件,避免以后修改一次重写一次
  • 也没整合
  • 多线程也没写

next step

  • [ ] 问约定特殊值
  • [ ] 问多少有效位,保留多少位小数
  • [ ] 查怎么使允许有空项
  • [ ] 那些表,删了重建
  • [ ] 之后在现在这个工程的基础上,把八个表都存到DB里