使用string.format的SQL查询

时间:2012-10-12 10:09:29

标签: c# sql-server

我正在用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'");

它给我例外如下:

  

索引(基于零)必须大于或等于零且更小   比参数列表的大小。

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

3 个答案:

答案 0 :(得分:2)

这不起作用并引发FormatException

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

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

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

String.Format Method (String, Object[])

修改:发现了另一个错误:

替换

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

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

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

  

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


>>> 但我建议改用Parameters

答案 1 :(得分:0)

这是给出错误的行

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

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

答案 2 :(得分:0)

在这么短的代码中,所以错了。我想你想要的是下面的内容,但我强烈建议您切换到使用parameters。将所有内容视为字符串是一个麻烦的邀请:

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 */

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