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 に答える