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"!데데뭐 가가? Column1
Column2
입니다.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
'programing' 카테고리의 다른 글
WordPress가 IN() 조건으로 준비한 문 (0) | 2023.02.27 |
---|---|
Angular에서의 ng-repeat 루프 내의 ng-model 바인딩JS (0) | 2023.02.27 |
기능에 대한 Jest Spy (0) | 2023.02.27 |
노드 js를 사용하여 html 파일을 실행하는 방법 (0) | 2023.02.27 |
매니페스트: 행: 1, 열: 1, 구문 오류 (0) | 2023.02.27 |