为什么我会收到ORA-01722(无效号码)?

我一直在使用参数化查询将值插入到Oracle表中,如下所示:

var q = "insert into MyTable(Field1, Field2...) values(:Field1, :Field2...)"; var cmd = new OracleCommand(q, conn); // conn is a pre-existing connection cmd.Parameters.Add("Field1", field1Val); cmd.Parameters.Add("Field2", field2Val); // etc... cmd.ExecuteNonQuery(); 

这一直工作正常,但突然这已停止工作,我收到Oracle错误ORA-01722(无效数字)。 我检查了参数,所有数字无疑都是有效的数字。 我甚至为任何空值替换了虚拟值,我仍然得到错误。 我在直接sql(使用OraDeveloper Studio)中尝试了相同的查询,即使使用相同的参数也可以。

如何跟踪这个?

编辑:评论中的每个请求,这是创建表语句:

 CREATE TABLE ALPHA.VISITFINDINGS ( ID NUMBER(12), VISITID NUMBER(12) NOT NULL, DESCRIPTION VARCHAR2(100), CUSTOMIMAGE CLOB, VISUALFINDINGSSECTIONMAPID NUMBER(12), FINDINGSID NUMBER(12), CONSTRAINT FK_VISITFINDINGS_AREA FOREIGN KEY (VISUALFINDINGSSECTIONMAPID) REFERENCES ALPHA.VISUALFINDINGSSECTIONMAP(VISUALFINDINGSSECTIONMAPID), CONSTRAINT FK_VISITFINDINGS_FINDINGS FOREIGN KEY (FINDINGSID) REFERENCES ALPHA.FINDINGS(FINDINGSID), CONSTRAINT FK_VISITFINDINGS_VISIT FOREIGN KEY (VISITID) REFERENCES ALPHA.VISITS(VISITID), CONSTRAINT PK_VISITFINDINGS PRIMARY KEY (ID)) TABLESPACE USERS STORAGE ( INITIAL 64K MAXEXTENTS UNLIMITED ) LOGGING; 

我已经给出了答案信用,但我认为在这里确切地提到我的问题的根源是什么,以防其他人在寻找他们自己的问题的答案时找到这个项目。

问题是Oracle的参数化查询的C#实现包含一个严重且有潜在危险的错误 – 一个真正的“公共领域”:

你的参数命名无关紧要; 它们必须按照它们在查询中出现的顺序添加。

在这里查看更多。

当你说你检查参数时,你的意思是SqlCommand类上的Parameters集合? 您可能会在SqlParameter页面上违反此注释 :

使用SqlParameter构造函数的此重载指定整数参数值时请小心。 因为此重载采用Object类型的值,所以必须在值为零时将整数值转换为Object类型,如下面的C#示例所示。 复制

 Parameter = new SqlParameter("@pname", Convert.ToInt32(0)); 

如果不执行此转换,编译器会假定您尝试调用SqlParameter(string,SqlDbType)构造函数重载。

我建议你使用类似的东西

 cmd.Parameters.Add( new SqlParameter("Field1", SqlDbType.Int32) { Value = field1Val }); 

而是明确设置类型。

 command.BindByName = true; 

请看这个探索。