我在C#中编写一个方法来从WCF服务查询SQL Server Express数据库。我必须使用ADO.NET来执行此操作(稍后使用LINQ重写它)。
该方法需要两个字符串(fname, lname
)然后返回"健康保险否#34;来自匹配记录的属性。我想把它读成一个列表(还有其他一些要检索的属性)。
当前代码返回一个空列表。我哪里错了?
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;
}
答案 0 :(得分:19)
您正试图通过DataTable
&gt;在循环中加载DataTable.Load
&lt;。你只需要一次。您还在循环中使用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-injection。
答案 1 :(得分:3)
我会这样做:
conn.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
dt.Load(reader);
}
foreach (var row in dt.AsEnumerable())
{
result.Add(row["Health Insurance NO"].ToString());
}