¿Cómo parametrizar consultas complejas de OleDB?

Estoy tratando de refactorizar un código que utiliza la concatenación de cadenas para crear comandos SQL (lo que lo hace vulnerable para una inyección SQL). Básicamente, todo lo que intento hacer es reemplazar todas lasstring sqlToExecute = String.Format(..) declaraciones con un comando SQL y una lista de parámetros OleDB.

Entiendo cómo se puede hacer esto para casos simples comoString.Format("Select * from myTable where id = {0}", id). Sin embargo, no pude encontrar un conjunto de buenos ejemplos para consultas SQL más complejas.

Aquí están algunas de las consultas que no estoy seguro de cómo puedo parametrizar exactamente:

1. Los parámetros se usan tanto para el nombre de columna como para el alias; El parámetro consta de dos variables:

    selQueryBldr.AppendFormat("SELECT * FROM {0} {1} 
    INNER JOIN ColChange CC ON CC.TableRecordID = {1}.{2} and CC.EntityID='{3}'",
    entity.StageTableName, stageTableAlias, entity.PrimaryKey, entity.EntityID);

2. El mismo parámetro se utiliza en varias cláusulas SQL IN

onsulta @SQL:

      SELECT A.TablePrefix ...
      FROM Entity E
      INNER JOIN App A
      ON A.AppID = E.AppID
      WHERE E.AppID in (#APPIDS#)

      UNION

      SELECT A.TablePrefix ...
      FROM EntityB EB
      INNER JOIN App A
      ON A.AppID = EB.AppID
      WHERE EB.AppID in (#APPIDS#)

Actualmente, el parámetro se agrega al código mediante el método String.Replace ():

    sqlQuery = sqlQuery.Replace("#APPIDS#",idList);

3. Utilizando variables como nombre de parámetro y valor de parámetro:

    StringBuilder dataQuery = new StringBuilder("Select * from {0} WHERE {1}='{2}'",
    tableName, primaryKey[0], changeRow["TableRecordID"]);

4. La variable utilizó una parte del parámetro unicode:

    sSQL = string.Format("SELECT name FROM sysobjects WHERE id = object_id(N'[dbo].[{0}]')",
    sSPName);


Además, todos estos ejemplos están usando clases OleDb (OleDbConnection / OleDbCommand, etc.), por lo que hasta donde yo entiendo, los parámetros con nombre no se pueden usar aquí.

Respuestas a la pregunta(2)

Su respuesta a la pregunta