我正在用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'");
它给我例外如下:
索引(基于零)必须大于或等于零且更小 比参数列表的大小。
所以,请给我解决这个例外。
答案 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 */
我们可能仍然需要在某些地方插入一些('
)引号字符,因为我猜测其中一些格式化的值将是字符串。 然后我们必须处理转义引号。