簡體   English   中英

如何參數化復雜的OleDB查詢?

[英]How to parameterize complex OleDB queries?

我正在嘗試重構一些使用字符串連接來創建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等),因此據我了解,此處不能使用命名參數。

不同的后端允許(或不允許)命名參數或“?” 參數的占位符,所以您要做的是構建查詢,例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM