sql >> Database >  >> RDS >> Oracle

DbCommand en geparametriseerde SQL, ORACLE versus SQL Server

Ik heb lang geleden een antwoord op deze vraag geaccepteerd, maar om de een of andere reden is dat antwoord er niet meer... Dus ik denk dat ik mijn eigen vraag moet beantwoorden.

Wat ik deed was een parambuilder-klasse maken:

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

}

Ik maak een lidvariabele van het ParamBuilder-type:

private readonly ParamBuilder m_ParamBuilder;

In de methode waarbij ik parameters gebruik, gebruik ik het als volgt:

...
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. Lente, Slaapstand, Blob Lazy Loading

  2. Barman gebruiken om een ​​back-up te maken van PostgreSQL - een overzicht

  3. SQL-uitzondering tijdens verbinding met SQL-server

  4. De bewerking is niet geldig voor de status van de transactiefout en het transactiebereik