SqlDataReader读入List
我在C#中编写一个方法来从WCF服务查询SQL Server Express数据库。 我必须使用ADO.NET来执行此操作(然后使用LINQ重写它)。
该方法接受两个字符串( fname, lname
),然后从匹配记录中返回“Health Insurance NO”属性。 我想把它读成一个列表(还有其他一些要检索的属性)。
当前代码返回一个空列表。 我哪里错了?
public List 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 result = new List(); 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; }
您正在尝试通过DataTable.Load
>在循环<中加载DataTable
。 你只需要一次。 你也在循环中使用reader.Read()
。 SqlDataReader.Read()
使读者前进到下一条记录而不使用它。 如果您打算使用DataTable.Load
,则无需先阅读阅读器。 所以你只需要完全删除循环来加载表。
但是既然你想要返回一个列表,根本不需要DataTable
,只需循环阅读器:
List result = new List (); using (conn) { conn.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while(reader.Read()) { result.Add(Convert.ToString(reader["Health Insurance NO"])); } } }
除此之外,你可以在没有sql参数的情况下进行sql-injection。
我会这样做:
conn.Open(); using (SqlDataReader reader = command.ExecuteReader()) { dt.Load(reader); } foreach (var row in dt.AsEnumerable()) { result.Add(row["Health Insurance NO"].ToString()); }