我正在用C#编写一种从WCF服务查询SQL Server Express数据库的方法。我必须使用ADO.NET来做到这一点(然后稍后用LINQ重写它)。
该方法采用两个字符串(fname, lname),然后从匹配记录中返回“ Health Insurance NO” (健康保险否)属性。我想将其读入列表(还有一些其他属性也可以检索)。
fname, lname
当前代码返回一个空列表。我要去哪里错了?
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; }
您正在尝试加载DataTable经DataTable.Load>在一个循环<。您只需要一次。您还在reader.Read()循环中使用。SqlDataReader.Read()使读者前进到下一条记录,而不会消耗它。如果要使用DataTable.Load,则无需先阅读阅读器。因此,您只需要完全删除循环即可加载表。
DataTable
DataTable.Load
reader.Read()
SqlDataReader.Read()
但是,由于您要返回列表,因此根本不需要列表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注入。