0

以下のコードを実行するたびに、データベースに「sam」という名前の誰かが表示されるはずですが、1 人だけが表示されるわけではありません...

public IEnumerable<Person> GetPersons(string name)
        {
            string PersonID;
            string PersonName;
            var info = new Person[] {};
            try
            {
                string connectionString =
                    @"Password=nottelling;Persist Security Info=True;User ID=nottelling;Initial Catalog=customers;Data Source=db.example.com;";
                using (var connection = new SqlConnection(connectionString))
                {
                    string command = string.Format(@"SELECT Fname, PersonID, Lname FROM Person Where Fname = '{0}'",name);
                    connection.Open();
                    var getperson = new SqlCommand(command, connection);
                    SqlDataReader reader = getperson.ExecuteReader();
                    while (reader.Read())
                    {
                        PersonID = reader["PersonID"].ToString();
                        PersonName = reader["Fname"].ToString();
                        PersonName += " ";
                        PersonName += reader["Lname"].ToString();
                        info = new Person[] {new Person {PersonId = PersonID, Name = PersonName}};
                    }
                    connection.Close();
                }
            }
            catch (Exception ex)
            {
                PersonID = "Error:";
                PersonName = ex.Message;
                info = new[] {new Person {PersonId = PersonID, Name = PersonName}};

            }
            return info;
        }

そして人は:

namespace Calculator.Models
{
    public class Person
    {
        public string PersonId { get; set; }
        public string Name { get; set; }
    }
}

別のプログラムで既に複数回テストしたため、クエリは機能します。エラーは次のものからだと思います:

info = new Person[] {new Person {PersonId = PersonID, Name = PersonName}};

info の値全体を置き換えるため、値全体を置き換えずに追加するだけです。

4

2 に答える 2

2

更新:DanC の推奨に従って、配列の型を変更しました

毎回新しい配列を割り当てています...配列に追加する必要があります...ArrayList使いやすさのためにクラスのようなものを使用してください

それ以外の...

public IEnumerable<Person> GetPersons(string name)

への変更...

public List<Person> GetPersons(string name)

それ以外の...

var info = new Person[] {};

への変更...

List<Person> info = new List<Person>;

それ以外の...

info = new Person[] {new Person {PersonId = PersonID, Name = PersonName}};

への変更...

info.Add(new Person {PersonId = PersonID, Name = PersonName});
于 2012-06-22T20:15:57.303 に答える
0

これを行う:

    public IEnumerable<Person> GetPersons(string name)
    {
        string connectionString = @"Password=nottelling;Persist Security Info=True;User ID=nottelling;Initial Catalog=customers;Data Source=db.example.com;";
        using (var connection = new SqlConnection(connectionString))
        {
            string command = string.Format(@"SELECT Fname, PersonID, Lname FROM Person Where Fname = '{0}'", name);
            connection.Open();

            using (var getperson = new SqlCommand(command, connection))
            using (var reader = getperson.ExecuteReader())
            {
                while (reader.Read())
                {
                    string PersonID = reader["PersonID"].ToString();
                    string PersonName = reader["Fname"].ToString();
                    PersonName += " ";
                    PersonName += reader["Lname"].ToString();
                    yield return new Person {PersonId = PersonID, Name = PersonName};
                }
            }
        }
    }    

そのひどい例外処理を取り除きました。中間リストを作成する必要がないように、yield return が追加されました。.ToList() または .ToArray() または呼び出しサイトで何でもできます。他のオブジェクトを破棄するための適切な using ステートメントを追加しました。冗長な接続クローズを削除しました。

さらに、文字列置換の代わりにパラメーター化されたクエリを実際に使用する必要があります。そのコードは sql インジェクションに対して脆弱ですが、いくつかの作業を残します。:D

于 2012-06-22T20:34:18.503 に答える