为什么我得到一个ORA-01722(无效号码)? [英] Why am I getting an ORA-01722 (invalid number)?

查看:185
本文介绍了为什么我得到一个ORA-01722(无效号码)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用参数化查询将值插入一个Oracle表,就像这样:

  VAR Q =插入MyTable的(字段1,字段2 ...)的值(:字段1,:场...); 
变种CMD =新的OracleCommand(Q,康涅狄格州); // conn是预先存在的连接
cmd.Parameters.Add(字段1,field1Val);
cmd.Parameters.Add(字段2,field2Val);
//等等......
cmd.ExecuteNonQuery();

这一直工作正常,但突然这已停止工作,而我得到Oracle错误ORA- 01722(无效号码)。我检查了参数,所有的数字毫无疑问是有效的数字。我甚至取代虚拟值任何空,而我仍然得到错误。我尝试(使用OraDeveloper工作室)的直接SQL相同的查询,它的作品,即使使用相同的参数。



如何跟踪这一轮下来?



编辑:占该意见要求,这里的create table语句:

  CREATE TABLE ALPHA.VISITFINDINGS(
ID号(12),
VISITID NUMBER(12)NOT NULL,
说明VARCHAR2(100),
CUSTOMIMAGE CLOB,
VISUALFINDINGSSECTIONMAPID NUMBER(12),
FINDINGSID NUMBER(12),
约束FK_VISITFINDINGS_AREA外键(VISUALFINDINGSSECTIONMAPID)
号ALPHA.VISUALFINDINGSSECTIONMAP(VISUALFINDINGSSECTIONMAPID),
约束FK_VISITFINDINGS_FINDINGS外键(FINDINGSID)
号ALPHA.FINDINGS(FINDINGSID),
约束FK_VISITFINDINGS_VISIT外键(VISITID)
参考ALPHA.VISITS(VISITID),
约束PK_VISITFINDINGS PRIMARY KEY( ID))
TABLESPACE USERS
储存(
初始64K
MAXEXTENTS UNLIMITED

测井;


解决方案

我已经给了答案信贷了,但我认为这是值得一提的正是我的问题的根源是,如果任何人发现这个项目在寻找的答案,他们自己的问题。



现在的问题是,在C#实施甲骨文参数化查询包含一个严肃和有潜在危险的错误 - 一个真正的公共领域坑:



这不要紧,你的名字是什么您的参数;他们已经在它们出现在查询中的顺序添加。



查看更多的这里


I've been using a parameterized query to insert values into an Oracle table, like so:

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();

This has been working fine, but suddenly this has stopped working, and I am getting Oracle error ORA-01722 (invalid number). I have checked the parameters, and all numbers are unquestionably valid numbers. I even substituted dummy values for any nulls, and I still get the error. I tried the same query in direct sql (using OraDeveloper Studio), and it works, even with the identical parameters.

How do I track this one down?

EDIT: per request in the comments, here's the create table statement:

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;

解决方案

I have given answer credit already, but I think it's worth mentioning here exactly what the root of my problems was, in case anyone else finds this item while looking for an answer to their own problem.

The problem is that the C# implementation of parameterized queries for Oracle contains a serious and potentially dangerous bug - a real "pit in the public domain":

It doesn't matter what you name your parameters; they have to be added in the order in which they appear in the query.

See more here.

这篇关于为什么我得到一个ORA-01722(无效号码)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆