ODP.NET을 사용하여 이름별로 쿼리 매개 변수 바인딩
현재 Microsoft ADO를 사용하고 있습니다.오라클용 NET 프로바이더(System.Data.OracleClient
). Oracle이 사용 가능한 최고의 Oracle 프로바이더는 아니며 곧 사용되지 않을 것이라는 점을 알고 있습니다. Oracle의 ODP를 사용해야 합니다.대신 NET.제가 아직도 MS 프로바이더를 사용하는 이유는 ODP 때문입니다.NET은 이름이 아닌 위치별로 매개 변수를 바인딩합니다.쿼리에서 많은 매개 변수를 사용할 때 이는 실제로 PITA가 될 수 있습니다. 올바른 순서로 매개 변수를 추가하려면 주의해야 하므로 버그가 쉽게 발생할 수 있습니다.또한 다음과 같이 동일한 쿼리에서 동일한 매개 변수를 여러 번 사용하는 경우에도 문제가 됩니다.
SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0
ODP를 사용합니다.NET, 두 가지 매개 변수를 추가해야 합니다.OracleCommand
내 생각엔 바보같은...
ODP.NET의OracleCommand
이 기본 동작을 변경할 수 있는 속성이 있습니다.BindByName
true로 설정하면 매개 변수가 이름으로 바인딩됩니다.불행하게도 이것은 저에게 별로 도움이 되지 않습니다, 왜냐하면:
- 기본적으로 false로 설정되어 있습니다.
- 저는 콘크리트 ADO를 거의 사용하지 않습니다.명시적으로 NET 수업, 저는 ADO를 사용하는 것을 선호합니다.NET 2.0 추상화 계층(
DbProviderFactory
,DbConnection
,DbCommand
...) 특정 RDBMS와의 결합을 줄이기 위해 사용합니다. 그래서 나는 그것에 접근할 수 없습니다.BindByName
재산, 내가 명시적으로 캐스팅하지 않는 한.OracleCommand
모든 이익이나 추상성을 잃는 것. - ASP를 사용하는 경우.NET SqlDataSource, 내가 직접 DbCommand를 생성하지 않으므로 설정할 기회가 없습니다.
BindByName
true(Selecting 이벤트에서 수행할 수 있지만 각 SqlDataSource에 대해 수행하는 것은 정말 어려운 작업입니다...)
제가 그 문제를 어떻게 처리해야 합니까?있습니까?BindByNameByDefault
어딘가에 설정? (그런 것을 찾지 못했지만, 놓쳤을 수도 있습니다...)
사용할 기본값을 사용하는 자체 공급자를 생성할 수 있다고 생각합니다.odp.net 에서 모든 클래스를 상속하여 해당 공급자를 쉽게 만들 수 있습니다. BindByName과 같은 일부 속성을 조정하기만 하면 됩니다.
DbProvider 공장에서 일반 odp.net 클래스 대신 클래스를 만듭니다.
간접 사용 및 상속!추상 데이터베이스 클래스를 통해 데이터 액세스를 수행하는 경우, 데이터베이스 구현 핸들 매개변수 바인딩이 필요합니다.
public abstract class Database
{
private readonly DbProviderFactory factory;
protected Database(DbProviderFactory factory)
{
this.factory = factory;
}
public virtual DbCommand CreateCommand(String commandText)
{
return CreateCommand(CommandType.Text, commandText);
}
public virtual DbCommand CreateCommand(CommandType commandType, String commandText)
{
DbCommand command = factory.CreateCommand();
command.CommandType = commandType;
command.Text = commandText;
return command;
}
public virtual void BindParametersByName(DbCommand command)
{
}
}
또한 기본 명령 생성을 재정의하거나 이름으로 매개 변수를 바인딩하는 옵션을 제공하는 Oracle 관련 구현을 생성하도록 선택합니다.
public class OracleDatabase : Database
{
public OracleDatabase()
: base(OracleClientFactory.Instance)
{
}
public override DbCommand CreateCommand(CommandType commandType, String commandText)
{
DbCommand command = base.CreateCommand(commandType, commandText);
BindParametersByName(command);
return command;
}
public override void BindParametersByName(DbCommand command)
{
((OracleCommand)command).BindByName = true;
}
}
엔터프라이즈 라이브러리의 데이터 액세스 응용 프로그램 블록 기반 코드입니다.
마이크로소프트 ADO의 중단에 대해서입니다.오라클용 NET 프로바이더:
- 저는 ODP 대신에 그것을 계속 사용할 것입니다.NET, 당신의 문제는 그것과 관련된 수많은 문제들 중 하나일 뿐입니다.현재에도 에서 사용할 수 있습니다.NET 4.0(지원되지는 않지만).
- Oracle이 이 프로바이더를 사용할 수 없게 만든다면 DataDirect ADO와 같은 상용 솔루션을 사용할 것입니다.ADO에 완벽하게 통합되는 오라클용 NET 데이터 공급자 또는 오라클용 dotConnect.NET 프레임워크.그리고 그들은 이미 Entity Framework를 지원하고 있습니다(ODP는 Oracle이 명시한 것으로 알고 있습니다).NET은 그렇지 않을 것입니다.
ODP .NET은 이미 제 시간을 너무 많이 빼앗았습니다.
언급URL : https://stackoverflow.com/questions/1046632/binding-query-parameters-by-name-with-odp-net
'programing' 카테고리의 다른 글
SQL에서 문자열의 문자를 바꾸는 방법은 무엇입니까? (0) | 2023.07.20 |
---|---|
ValueError : 닫힌 파일의 I/O 작업 (0) | 2023.07.20 |
v$sql에서 수신한 Oracle 쿼리에서 매개 변수를 찾는 방법은 무엇입니까? (0) | 2023.07.20 |
Python에서 numpy로 자연 로그(예: "ln()")를 수행하는 방법은 무엇입니까? (0) | 2023.07.20 |
Oracle의 테이블에서 N번째 행 선택 (0) | 2023.07.20 |