1

この構造体を使用して、DataTable から取得したいくつかの行をリストに追加しようとしています。

protected struct roleProperties
{
    public string roleName { get; set; }
    public string[] functionTitle { get; set; }
}

ご覧のとおり、メソッド文字列内にさらに文字列が必要Titleです

私はこのようにしようとしています:

public void getRoleFuncs(int roleId)
{
    List<roleProperties> roles = new List<roleProperties>();
    int i = 1;

    SqlParameter ro_id = new SqlParameter("@ro_id", roleId);
    string q = "SELECT ro_name, fu_title FROM roles INNER JOIN rolefunctions ON roles.ro_id = rolefunctions.fk_role_id INNER JOIN functions ON rolefunctions.fk_func_id = functions.fu_id WHERE ro_id = @ro_id";
    SqlDataReader r = gm.returnReader(q, ro_id);
    while (r.Read())
    {
        roleProperties item = new roleProperties();
        item.roleName = r["ro_name"].ToString();
        foreach (IDataRecord str in r)
        {
            item.functionTitle[i] = r["fu_title"].ToString();
            i++;
        }
        roles.Add(item);
    }
}

しかし、次の行で null 参照を取得します。

item.functionTitle[i] = r["fu_title"].ToString();

誰かが私が間違っていることを見ることができますか?

4

3 に答える 3

3

item.functionTitleこれはnull、配列が参照型であり、プロパティをどこにも初期化していないためです(したがって、デフォルト値nullは参照型の場合です)。

それが問題ではなかったとしても(たとえばfunctionTitle、空の配列である場合)item.functionTitle[i]、範囲外のインデックスにアクセスしようとするため、再びスローされます。そして最後に、オフバイワンエラーが発生します。配列の最初の要素には、0ではなくインデックスがあり1ます。

コードを次のように変更することで、上記のすべてを修正できます。

while (r.Read())
{
    roleProperties item = new roleProperties();
    item.roleName = r["ro_name"].ToString();
    item.functionTitle = r.Select(o => o["fu_title"].ToString()).ToArray();
    roles.Add(item);
}
于 2013-02-25T12:14:03.817 に答える
1

最初にアレイを初期化します。

item.functionTitle = new string[n]; // where n is an int
于 2013-02-25T12:14:12.093 に答える
1

配列が初期化されていないため、必要になる配列のサイズがわからないため null 代わりにリストを使用する方が適切なアプローチのようです

構造体をに変更します

protected class roleProperties
{
    public string roleName { get; set; }
    public IList<string> functionTitle { get; private set;}
    public roleProperties(){
        functionTitle = new List<string>();
    }
}

そして変更

item.functionTitle[i] = r["fu_title"].ToString();

item.functionTitle.Add(r["fu_title"].ToString());

構造体は可変であり、可変構造体は悪であるため、構造体をクラスに変更しました。

于 2013-02-25T12:18:14.263 に答える