sql >> Databasteknik >  >> RDS >> Oracle

DbCommand och parametriserad SQL, ORACLE vs SQL Server

Jag accepterade ett svar på den här frågan för länge sedan, men av någon anledning finns inte det svaret längre... Så jag antar att jag måste svara på min egen fråga.

Det jag gjorde var att skapa en parabuilderklass:

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;
    }

}

Jag skapar en medlemsvariabel av typen ParamBuilder:

private readonly ParamBuilder m_ParamBuilder;

Sedan i metoden där jag använder parametrar, använder jag den enligt följande:

...
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);
...


  1. Söka efter text inom Oracle Stored Procedures

  2. Hur man använder mysqli persistent anslutning över olika sidor

  3. Lägger till "seriell" till befintlig kolumn i Postgres

  4. Skapa mysql-datumintervall