programing

ORA-01722(잘못된 번호)가 표시되는 이유는 무엇입니까?

padding 2023. 9. 25. 22:23
반응형

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(잘못된 번호)가 발생합니다.파라미터를 확인해보니 모든 숫자가 의심할 여지 없이 유효한 숫자입니다.모든 널에 더미 값을 대입했는데도 여전히 오류가 발생합니다.direct sql(OraDeveloper Studio 사용)에서 동일한 쿼리를 시도했는데, 동일한 매개 변수를 사용하더라도 작동합니다.

이걸 어떻게 추적하죠?

EDIT: 주석의 요청에 따라 다음과 같이 테이블 작성문을 작성합니다.

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# 구현에 심각하고 잠재적으로 위험한 버그가 포함되어 있다는 것입니다. 즉, 실제 "공용 도메인의 pit"입니다.

매개변수의 이름을 무엇으로 지정하는지는 중요하지 않으며, 매개변수는 쿼리에 나타나는 순서대로 추가해야 합니다.

여기서 더 보기.

파라미터를 확인했다는 것은, 당신이 의미하는 것은ParametersSqlCommand 클래스에 대한 수집?SqlParameter 페이지에서 이 노트를 무시할 수 있습니다.

SqlParameter 생성기의 이 오버로드를 사용하여 정수 매개 변수 값을 지정할 때는 주의해야 합니다.이 오버로드는 Object 유형의 값을 취하기 때문에 다음 C# 예제가 보여주는 것처럼 값이 0일 때 적분값을 Object 유형으로 변환해야 합니다. Copy

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

이 변환을 수행하지 않으면 컴파일러는 SqlParameter(string, SqlDbType) 생성자 오버로드를 호출하려고 하는 것으로 가정합니다.

당신에게 다음과 같은 것을 사용할 것을 제안합니다.

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

형식을 명시적으로 설정합니다.

command.BindByName = true;

설명을 참조해 주시기 바랍니다.

언급URL : https://stackoverflow.com/questions/3866275/why-am-i-getting-an-ora-01722-invalid-number

반응형