0

我正在用 C# 开发一个 Web 应用程序,我想使用 string.format 函数编写 sql 查询,如下所示:

string sSql = string.Format("Select * From {0}", DbReference.TABLE_NAME_SEC_ROLES);
                if (roleCriteria._roleName != null && roleCriteria._isEnabled == true)
                    sSql += string.Format(" where {0}={1} and {2}={3} " + DbReference.ROLE_NAME_COL, roleCriteria._roleName, DbReference.IS_ENABLED_COL, roleCriteria._isEnabled);
                if (roleCriteria._roleName != null)
                    sSql += string.Format(" where {1} = {2} " + DbReference.ROLE_NAME_COL, roleCriteria._roleName);
                if (roleCriteria._isEnabled == true)
                    sSql += string.Format("where {0}" + DbReference.IS_ENABLED_COL + "'false'");

它给了我如下例外:

索引(从零开始)必须大于或等于零且小于参数列表的大小。

所以,请给我这个例外的解决方案。

4

3 回答 3

2

这不起作用并引发FormatException

string.Format(" where {1} = {2} " + DbReference.ROLE_NAME_COL, roleCriteria._roleName);

相反,您需要从零开始,因为{2}它等于 args 数组的长度,这是不允许的:

string.Format(" where {0} = {1} " + DbReference.ROLE_NAME_COL, roleCriteria._roleName);

String.Format方法(字符串,对象 [])

编辑:发现另一个错误:

代替

string.Format("where {0}" + DbReference.IS_ENABLED_COL + "'false'")

string.Format("where {0}", DbReference.IS_ENABLED_COL + "'false'")

此处您已指定格式项但未添加参数。

表示要格式化的参数的数字小于零,或者大于或等于 args 数组的长度


>>>但我建议改用参数

于 2012-10-12T10:13:34.707 回答
0

这么短的一段代码有很多错误。我认为您想要的内容如下,但我强烈建议您切换到使用参数。将所有内容都视为字符串会招来麻烦:

string sSql = string.Format("Select * From {0}", DbReference.TABLE_NAME_SEC_ROLES);
if (roleCriteria._roleName != null && roleCriteria._isEnabled == true)
   sSql += string.Format(" where {0}={1} and {2}={3} " ,/* , not + */ DbReference.ROLE_NAME_COL, roleCriteria._roleName, DbReference.IS_ENABLED_COL, roleCriteria._isEnabled); 
else if (roleCriteria._roleName != null) /* else added, otherwise this will fire if the above if did, and add a second WHERE clause */
   sSql += string.Format(" where {0} = {1} " ,/* , not + */ DbReference.ROLE_NAME_COL, roleCriteria._roleName); 
else if (roleCriteria._isEnabled == true) /* else added, otherwise this will fire if the first if did, and add another WHERE clause */
   sSql += string.Format(" where {0} = 'false'" , DbReference.IS_ENABLED_COL); /* , not +, and moved 'false' */
   /* Also, indented the `where`, since if only this if is true, it would mash the `where` onto the table name */

而且我们可能仍然需要在某些'地方插入一些 ( ) 引号字符,因为我猜测其中一些格式化的值将是字符串。然后我们必须处理转义引号

于 2012-10-12T10:22:23.723 回答
0

这是给出错误的行

if (roleCriteria._roleName != null)                     
sSql += string.Format(" where {1} = {2} " + DbReference.ROLE_NAME_COL, roleCriteria._roleName); 

在这里,您使用了不存在的索引 2。您应该使用 0 和 1。

于 2012-10-12T10:18:48.277 回答