반응형
DbCommand 및 매개 변수화된 SQL, ORACLE 대 SQL Server
저에게는 여러 가지 데이터를 데이터베이스에 저장하는 애플리케이션이 있습니다.데이터베이스는 ORACLE 또는 SQL Server일 수 있습니다.SQL은 실행 중에 수집된 구성 및 값을 기반으로 동적으로 생성됩니다.
DbProviderFactory를 사용하면 파라미터/바인드 변수를 제외하고는 데이터베이스에 대한 사용자 지정 코드를 작성하지 않고도 ORACLE 또는 SQL Server 중 하나와 함께 작업할 수 있습니다.ORACLE의 경우 사용해야 합니다.":ParameterName"
SQL Server의 경우 사용해야 합니다."@ParameterName"
. 이 제네릭을 만들 방법은 없습니까?
샘플 코드:
public class DbOperations
{
private DbProviderFactory m_factory;
private DbConnection m_CN;
...
private void InsertToDb(ValueType[] values, ColumnType[] columns)
{
DbCommand Cmd = m_factory.CreateCommand();
Cmd.Connection = m_CN;
StringBuilder sql = new StringBuilder();
sql.Append("INSERT INTO ");
sql.Append(DestinationTable);
sql.Append(" (");
for (int i = 0; i < columns.Length; i++)
{
sql.Append(columns[i].ColumnName);
if (i < columns.Length - 1)
sql.Append(", ");
}
sql.Append(") VALUES (");
for (int i = 0; i < values.Length; i++)
{
//sql.Append(String.Format(":{0}", columns[i].ColumnName)); //ORACLE
sql.Append(String.Format("@{0}", columns[i].ColumnName)); // SQL Server
}
DbParameter param = m_factory.CreateParameter();
param.Direction = ParameterDirection.Input;
param.ParameterName = columns[i].ColumnName;
param.Value = values[i];
Cmd.Parameters.Add(param);
if (i < columns.Length - 1)
sql.Append(", ");
}
sql.Append(")");
Cmd.CommandText = sql.ToString();
Cmd.ExecuteNonQuery();
}
오래전에 이 질문에 대한 답을 받아들였지만, 어떤 이유에서인지 그 답은 더 이상 없습니다.그래서 저는 제 질문에 답해야 할 것 같습니다.
제가 한 일은 파라빌더 클래스를 만드는 것이었습니다.
class ParamBuilder
{
private DbProviderFactory m_factory;
private DbCommandBuilder m_builder;
private string m_parameterMarkerFormat;
public ParamBuilder(DbProviderFactory factory) : this(factory, null)
{
}
public ParamBuilder(DbProviderFactory factory, DbConnection source)
{
m_factory = factory;
m_builder = m_factory.CreateCommandBuilder();
if (source != null)
{
using (DataTable tbl =
source.GetSchema(DbMetaDataCollectionNames.DataSourceInformation))
{
m_parameterMarkerFormat =
tbl.Rows[0][DbMetaDataColumnNames.ParameterMarkerFormat] as string;
}
}
if (String.IsNullOrEmpty(m_parameterMarkerFormat))
m_parameterMarkerFormat = "{0}";
}
public DbParameter CreateParameter(string parameterName,
out string parameterMarker)
{
DbParameter param = m_factory.CreateParameter();
param.ParameterName =
(string)typeof(DbCommandBuilder).InvokeMember("GetParameterName",
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.InvokeMethod |
System.Reflection.BindingFlags.NonPublic, null, m_builder,
new object[] { parameterName });
parameterMarker =
String.Format(System.Globalization.CultureInfo.InvariantCulture,
m_parameterMarkerFormat, param.ParameterName);
return param;
}
}
ParamBuilder 유형의 멤버 변수를 만듭니다.
private readonly ParamBuilder m_ParamBuilder;
그런 다음 매개 변수를 사용하는 방법에서는 다음과 같이 사용합니다.
...
string paramMarker;
DbParameter param = m_ParamBuilder.CreateParameter(destination[i].ColumnName,
out paramMarker);
sql.Append(paramMarker);
param.Direction = ParameterDirection.Input;
param.Value = source[i];
Cmd.Parameters.Add(param);
...
"values" 루프에서 사용되는 형식 문자열을 가져오려면 추상 속성을 만듭니다.
class DBOperations
public abstract string ParameterStringFormat;
...
for (int i = 0; i < values.Length; i++)
{
sql.Append(String.Format(ParamterStringFormat, columns[i].ColumnName)); // SQL Server
}
class SqlDbOperations : DBOperations
public override string ParameterStringFormat { get { return "@{0}"; }}
class OracleDBOperations : DBOperations
public override string ParameterStringFormat { get { return ":{0}"; }}
당신이 빠르고 더럽고 싶다면 다른 옵션을 집어넣는 것뿐입니다.
string sql = select * from foo there foo.id = @id;
if (isOracle) {
sql = replaceAll(sql,"@",":");
}
언급URL : https://stackoverflow.com/questions/5295699/dbcommand-and-parameterized-sql-oracle-vs-sql-server
반응형
'programing' 카테고리의 다른 글
다른 테이블에 행을 삽입하도록 MySQL 트리거를 프로그래밍하는 방법은 무엇입니까? (0) | 2023.10.14 |
---|---|
WordPress의 register_post_status를 통해 새로운 사용자 지정 게시 상태 추가 (0) | 2023.10.14 |
이진 파일을 무시하는 PowerShell 검색 스크립트 (0) | 2023.10.14 |
JSON_TABLE을 사용하여 Oracle JSON 열에서 Key Value를 결과 집합으로 가져오는 방법 (0) | 2023.10.14 |
python에서 사용자 지정 메시지로 오류를 던지고 종료하는 방법 (0) | 2023.10.14 |