2014-03-27 36 views
0

我有一个格式化查询的严重问题,它可能会导致SQL注入,我看到一些类似的qstns,但不知道我怎么能在C#中使用它,因为我是新来的它。我使用C#,ODBC命令动态SQL查询形成,使用string.format

我有3个串像 qry ="select description from TableA" , qryOrder = " order by description" , qryAppend = " where ID = '{0}' order by description\", _selectedPlantID"提供_selectedId是另一个变量,现在我想用这些变量在不同的场景,形成差异查询,例如,qry + qry order,或qry + qryAppend

由于_selectedPlantId还需要,我用的String.format为:

_cmd.CommandText = "string.Format(\"" + qry + qryAppend + ")"; 

但它不工作。任何解决方案 错误是SQL引用的语法错误

在此先感谢!

+3

使用[参数化查询](http://www.dotnetperls.com/sqlparameter)。 – DGibbs

+3

仔细查看_cmd.CommandText的值。你可能实际上看到了问题。 –

回答

0

简而言之,这应该使它工作。你需要两个变量(布尔),以后我会解释为什么:

var shouldOrder = true; 
var shouldAppend = true; 

_cmd.CommandText = String.Format(
    "{0} {1} {2}", 
    qry, 
    shouldOrder ? qryOrder : String.Empty, 
    shouldAppend ? qryAppend : String.Empty 
); 

这两个变量(shouldOrdershouldAppend)将帮助你的“在不同的场景差异查询”如你所说。

使用true或false提供这些变量将改变文本进入String.Format的内容并相应地改变查询。

因此,如果您使用shouldOrder = false;查询命令将不会获得订单部分。设置shouldAppend = false;将避免将额外部分(追加)包括到SQL命令中。

现在,小心!

这不会解决您的SQL注入问题。我刚刚显示了一个快速修复。

为避免SQL注入,您必须更改您的SQL命令,并且不能再使用String.Format。

要了解如何做到这一点,请查看DGibbs评论。

+0

感谢您的详细解答:) – drk