小编典典

SqlDataReader读入List

sql

我正在用C#编写一种从WCF服务查询SQL Server Express数据库的方法。我必须使用ADO.NET来做到这一点(然后稍后用LINQ重写它)。

该方法采用两个字符串(fname, lname),然后从匹配记录中返回“ Health Insurance 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;
}

阅读 232

收藏
2021-03-23

共1个答案

小编典典

您正在尝试加载DataTableDataTable.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参数的sql注入。

2021-03-23