如何参数化复杂的OleDB查询?

时间:2012-03-10 21:24:23

标签: c# sql oledb sql-injection

我正在尝试重构一些使用字符串连接来创建SQL命令的代码(这使得SQL注入容易受到攻击)。基本上我所要做的就是用SQL命令和OleDB参数列表替换所有string sqlToExecute = String.Format(..)语句。

我理解如何针对像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 个答案:

答案 0 :(得分:1)

不同的后端允许(或不允许)命名参数或“?”参数的占位符,所以你要做的就是构建类似

的查询
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命令中。