Как параметризовать сложные запросы OleDB? - PullRequest
1 голос
/ 11 марта 2012

Я пытаюсь провести рефакторинг некоторого кода, который использует конкатенацию строк для создания команд 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 Ответ

1 голос
/ 12 марта 2012

Разные бэкэнды разрешают (или нет) либо именованные параметры, либо "?" заполнители для параметров, так что вам нужно создать запрос типа

OleDbCommand oCmd = new OleDbCommand( YourConnection, "select * from someTable where yourColumn = ? and otherColumn = ?" );

oCmd.Parameters.AddWithValue( "parm1", YourVariable.FormattedHoweverNeeded );
oCmd.Parameters.AddWithValue( "parm2", anotherVariable.FormattedHoweverNeeded );

Если столбцы ожидают строки, убедитесь, что строка. Если ожидается числовое значение (int, double, float и т. Д.), Оставьте также этот тип или другое (дата / время и т. Д.)

Просто обратите внимание ... если не использовать именованные параметры (как у меня с "?", Заполнитель), параметры должны быть добавлены в той же последовательности, что и "?" помещаются в команду SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...