10

WCF サービスから SQL Server Express データベースにクエリを実行するメソッドを C# で作成しています。これを行うには ADO.NET を使用する必要があります (後で LINQ で書き直します)。

このメソッドは 2 つの文字列 ( fname, lname) を受け取り、一致するレコードから「健康保険 NO」属性を返します。これをリストに読み込みたい (他にも取得する属性がいくつかあります)。

現在のコードは空のリストを返します。どこが間違っていますか?

public List<string> GetPatientInfo(string fname, string lname)
{
    string connString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Users\\xxxx\\Documents\\Visual Studio 2010\\Projects\\ADOWebApp\\ADOWebApp\\App_Data\\ADODatabase.mdf;Integrated Security=True;User Instance=True";

    SqlConnection conn = new SqlConnection(connString);

    string sqlquery = "SELECT Patient.* FROM Patient WHERE ([First Name] = '"+fname+"') AND ([Last Name] = '"+lname+"')";
    SqlCommand command = new SqlCommand(sqlquery, conn);
    DataTable dt = new DataTable();

    List<string> result = new List<string>();

    using (conn)
    {
        conn.Open();

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader != null && reader.Read())
            {
               dt.Load(reader);
               result.Add(Convert.ToString(reader["Health Insurance NO"]));
            }
        }
     }

     return result;
}
4

2 に答える 2

21

>ループ内<でDataTableビアをロードしようとしています。DataTable.Load一度だけ必要です。reader.Read()ループでも使用しています。SqlDataReader.Read()リーダーを消費せずに次のレコードに進めます。使用するDataTable.Load場合は、最初にリーダーを読む必要はありません。したがって、テーブルをロードするには、ループを完全に削除する必要があります。

しかし、まったく必要のないリストを返したいのでDataTable、リーダーをループするだけです:

List<string> result = new List<string>();
using (conn)
{
    conn.Open();
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while(reader.Read())
        {
            result.Add(Convert.ToString(reader["Health Insurance NO"]));
        }
    }
}

それとは別に、sql-parameters なしで sql-injection を使用できます。

于 2013-10-10T15:30:56.297 に答える
3

私はこのようにします:

 conn.Open();
 using (SqlDataReader reader = command.ExecuteReader())
 {
     dt.Load(reader);                  
 }

 foreach (var row in dt.AsEnumerable())
 {
     result.Add(row["Health Insurance NO"].ToString());
 }
于 2013-10-10T15:34:25.313 に答える