codememo

Oracle 문제의 매개 변수화된 쿼리

tipmemo 2023. 6. 27. 22:15
반응형

Oracle 문제의 매개 변수화된 쿼리

사용 중Oracle.DataAccess시대에 뒤떨어진 것보다는System.Data.OracleClient업데이트 쿼리에 여러 매개 변수를 전달하는 데 문제가 있는 것 같습니다.

작동합니다.

OracleCommand.CommandText = "UPDATE db SET column1 = :param1 WHERE column2 = 'Y'"
OracleCommand.Parameters.Add(New OracleParameter("param1", "1234"))

하지만 여러 매개 변수를 전달할 수 있으면 좋겠습니다.

제 전체 코드입니다.

    OracleConn.Open()
    OracleCommand = OracleConn.CreateCommand()
    OracleCommand.CommandText = "UPDATE db SET column1 = :param1 WHERE column2 = :param2"
    OracleCommand.CommandType = CommandType.Text
    OracleCommand.Parameters.Add(New OracleParameter("param1", "1234"))
    OracleCommand.Parameters.Add(New OracleParameter("param2", "Y"))
    OracleCommand.ExecuteNonQuery()

나의SELECT업데이트 매개 변수가 아닌 여러 매개 변수를 전달할 때 쿼리가 작동하는 것 같습니다.

당신의 예를 보면 틀린 것이 보이지 않지만, 당신이 옛사람에게 맞는 것은 아닌지 궁금합니다.BindByName문제.기본적으로 ODP.NET은 원하는 이름을 기반으로 하지 않고 컬렉션에 추가된 순서대로 쿼리에 매개 변수를 바인딩합니다.설정 시도BindByName로.true당신의OracleCommand이의를 제기하고 문제가 해결되는지 확인합니다.

이 문제가 너무 많이 발생하여 이 속성을 자동으로 설정하는 명령을 만들기 위해 자체 공장 방법을 사용합니다.true나를 위해.

여기에 쓸모없는 고전적인 Oracle 문서가 있습니다.

시스템의 기본 동작을 에뮬레이트합니다.Data.OracleClient, 이름별로 바인딩하도록 Oracle 명령을 설정해야 합니다.

OracleCommand.BindByName = True

지정된 유형으로 오라클 매개 변수를 새로 고쳐 보십시오.매개 변수 목록에 개체를 추가하기 전에 개체 값을 설정합니다.

var param1 = new OracleParameter( "param1", OracleType.Int32 );
param1.Value = "1234";

OracleCommand.Parameters.Add( param1 );

이거 해봐요, 효과가 있기를 바랍니다.컴파일이 가능합니다.
당신도 커밋을 보내야 할지...
저는 항상 저장 프로시저를 통해 이러한 작업을 수행하기 때문에 저장 프로시저에서 업데이트 문 다음에 커밋을 수행합니다.

하비 새더

        OracleConnection ora_conn = new OracleConnection("connection string");

        OracleCommand ora_cmd = new OracleCommand("UPDATE db SET column1 = :param1 WHERE column2 = :param2", ora_conn);
        ora_cmd.CommandType = CommandType.Text;
        ora_cmd.BindByName = true;

        ora_cmd.Parameters.Add(":param1", OracleDbType.Varchar2, "1234", ParameterDirection.Input);
        ora_cmd.Parameters.Add(":param2", OracleDbType.Varchar2, "Y", ParameterDirection.Input);

        ora_cmd.ExecuteNonQuery();                

첫 번째 코드 블록이 올바릅니다. 매개 변수 이름 앞에는 콜론을 사용하지만 OracleParameter에 대한 첫 번째 인수에는 콜론을 사용하지 않습니다.

오류가 발생하지 않으면 UPDATE가 성공적으로 실행되고 WHERE 절과 대체 매개 변수 값을 기반으로 레코드를 업데이트하지 않을 수 있습니다.업데이트에 WHERE 절이 없는 테스트 테이블에서 작업을 수행하여 작업이 제대로 수행되는지 확인합니다.

다음은 제가 주로 사용하는 구조 유형입니다(죄송합니다. 메모리에서 가져온 것입니다).

int rows = 0;
using ( OracleConnection conn = new OracleConnection(connectionString) ) {
  using ( OracleCommand cmd = conn.CreateCommand() ) {
    cmd.CommandText = "UPDATE table SET column1 = ':p1 WHERE column2 = :p2";
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue(":p1", p1Val);
    cmd.Parameters.AddWithValue(":p2", p2Val);
    rows = cmd.ExecuteNonQuery();
  }
}

핵심적인 차이점은 AddWithValue를 사용한다는 것입니다. 왜 제가 그것을 사용하게 되었는지는 기억나지 않지만, 다른 방법들 중 몇 가지에 문제가 있다는 것을 기억하세요.

언급URL : https://stackoverflow.com/questions/5980615/parameterized-query-in-oracle-trouble

반응형