Como parametrizar consultas OleDB complexas?
Estou tentando refatorar algum código que está usando concatenação de strings para criar comandos SQL (o que o torna vulnerável a uma injeção de SQL). Basicamente, tudo o que estou tentando fazer é substituir todos osstring sqlToExecute = String.Format(..)
nstruções @ com um comando SQL e uma lista de parâmetros OleD
Entendo como isso pode ser feito em casos simples comoString.Format("Select * from myTable where id = {0}", id)
. No entanto, não consegui encontrar um conjunto de bons exemplos para consultas SQL mais complexa
Aqui estão algumas das perguntas que não tenho certeza de como exatamente posso parametrizar:
1. Os parâmetros são usados para o nome da coluna e o alias; O parâmetro consiste em duas variáveis:
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. O mesmo parâmetro é usado em várias cláusulas SQL IN
SQL Query:
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#)
Atualmente, o parâmetro é adicionado ao código usando o método String.Replace ():
sqlQuery = sqlQuery.Replace("#APPIDS#",idList);
3. Usando variáveis como um nome de parâmetro e um valor de parâmetro:
StringBuilder dataQuery = new StringBuilder("Select * from {0} WHERE {1}='{2}'",
tableName, primaryKey[0], changeRow["TableRecordID"]);
4. A variável usou uma parte do parâmetro unicode:
sSQL = string.Format("SELECT name FROM sysobjects WHERE id = object_id(N'[dbo].[{0}]')",
sSPName);
Além disso, todos esses exemplos estão usando as classes OleDb (OleDbConnection / OleDbCommand etc.), pelo que entendo os parâmetros nomeados não podem ser usados aqu