programing

C# Oracle 파라미터화된 쿼리 - 심각하고 위험한 버그!

topblog 2023. 2. 27. 23:19
반응형

C# Oracle 파라미터화된 쿼리 - 심각하고 위험한 버그!

이건 완전 울부짖는 놈이야제 눈을 믿을 수 없고, C#의 정품 버그라면 지금까지 아무도 이것을 발견하지 못했다는 것을 믿을 수 없기 때문에, 다른 개발자 커뮤니티에 제 잘못을 알리고 있습니다.이 질문에는 분명 내가 "DOH!"라고 말하고 손바닥으로 머리를 세게 때리는 것이 포함될 것이다.-어쨌든, 여기 있다.

.Test_1 을 붙입니다

CREATE TABLE TEST_1 (
  COLUMN1 NUMBER(12) NOT NULL,
  COLUMN2 VARCHAR2(20),
  COLUMN3 NUMBER(12))
TABLESPACE USERS
STORAGE (
  INITIAL 64K
  MAXEXTENTS UNLIMITED
)
LOGGING;

이제 다음 코드를 실행합니다.

var conn = new OracleConnection("connectionblahblah");
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = 
  "insert into Test_1(Column1, Column2, Column3) " +
  "values(:Column1, :Column2, :Column3)";
var p = cmd.Parameters;
p.Add("Column1", 1);
p.Add("Column3", null);
p.Add("Column2", "record 1");
cmd.ExecuteNonQuery();

ORA-01722 - "ORA-01722"!데데뭐 가가? Column1Column2입니다.Column3무효 컬럼이므로 문제가 발생하지 않을 것입니다.

아, 아, 아, 아...Column3 ★★★★★★★★★★★★★★★★★」Column2에 추가되는 순서로 전치됩니다.OracleParameterCollection★★★★★★★★★★★★★★★★★!!!!

물론, 이것은 나를 다음 명백한 실험으로 이끈다.파라미터를 추가하기 위해 코드 블록을 다음과 같이 변경합니다.

p.Add("Foo", 1);
p.Add("Bar", "record 1");
p.Add("hahahahahahaha", null);

그게 될 것 같아?그거 알아맞혀 봐!

나는 여기 완전히 망연자실하게 앉아있다.나는 내가 보고 있는 것을 믿을 수 없고, 내 앞에 있는 누구도 이러한 행동을 발견하지 못했다는 것도 믿을 수 없다(구글을 제대로 사용하는 방법을 알지 못하는 한).

이것은 단지 성가신 일이 아니다 - 그것은 심각하게 위험하다.같은 데이터 유형의 두 열을 바꾸면 어떻게 될까요?잘못된 데이터를 잘못된 열에 삽입했을 뿐이지, 오류조차 나지 않았을 것입니다.

파라미터를 잘못된 순서로 추가하지 않도록 주의하는 것 외에 회피책에 대한 아이디어가 있는 사람이 있습니까?

이는 버그가 아니라 Oracle ODP에서 명시적으로 언급되어 있습니다.는 기본적으로.Oracle Command를 사용합니다. 하는 는, 합니다.cmd.BindByName = true;명쾌하게

Oracle 매뉴얼 참조.http://download.oracle.com/docs/cd/E11882_01/win.112/e12249/OracleCommandClass.htm#i997666

2열 앞에 3열이 추가된 오타인가요?

콜론 구문은 Bind variable--name은 PLSQL의 BIND 변수와 무관함을 나타내므로 BIND 변수들은 제출 순서대로 채워집니다.즉, column2 값을 "record 1"로 설정하려고 하면 잘못된 숫자 오류가 설명됩니다.

현재 다음이 있습니다.

p.Add("Column1", 1);
p.Add("Column3", null);
p.Add("Column2", "record 1");

...이 변경으로 문제가 해결되는지 확인합니다.

p.Add("Column1", 1);
p.Add("Column2", "record 1");
p.Add("Column3", null);

명명된 매개 변수를 작동하려면?

명명된 파라미터가 어떻게 동작하는지 설명하려면 C# 경험이 더 많은 사람에게 맡겨야 합니다.하지만 대장이 Oracle BIND 변수로 해석되는 것으로 보여서 다행입니다.

p.Add(":Column1", 1);
p.Add(":Column2", "record 1");
p.Add(":Column3", null);

//참고:를 Oracle 데이터 클라이언트에서 인식할 파라미터 이름에 추가했습니다.

언급URL : https://stackoverflow.com/questions/3876856/c-sharp-parameterized-queries-for-oracle-serious-dangerous-bug

반응형