Как параметризовать сложные запросы OleDB?

Я пытаюсь реорганизовать некоторый код, который использует конкатенацию строк для создания команд SQL (что делает его уязвимым для инъекции SQL). В основном все, что я пытаюсь сделать, это заменить всеstring sqlToExecute = String.Format(..) операторы с командой SQL и списком параметров OleDB.

Я понимаю, как это можно сделать для простых случаев, таких какString.Format("Select * from myTable where id = {0}", id), Однако я не смог найти набор хороших примеров для более сложных запросов SQL.

Вот некоторые из запросов, которые я не уверен, как именно я могу параметризовать:

1. Параметры используются как для имени столбца, так и для псевдонима; Параметр состоит из двух переменных:

    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. Один и тот же параметр используется в нескольких предложениях SQL IN

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#)

В настоящее время параметр добавляется в код с помощью метода String.Replace ():

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

3. Использование переменных в качестве имени параметра и значения параметра:

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

4. Переменная использовала часть параметра unicode:

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


Кроме того, все эти примеры используют классы OleDb (OleDbConnection / OleDbCommand и т. Д.), Поэтому, насколько я понимаю, именованные параметры не могут использоваться здесь.

Ответы на вопрос(1)

Ваш ответ на вопрос