我正在尝试重构一些使用字符串连接来创建 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 等),因此据我了解,此处不能使用命名参数。