Как параметризовать сложные запросы 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 и т. Д.), Поэтому, насколько я понимаю, именованные параметры не могут использоваться здесь.