WCF SqlDataReader始终返回最后一行乘以所有行数
这是我的服务代码:WCF SqlDataReader始终返回最后一行乘以所有行数,sql,sql-server,wcf,service,sqldatareader,Sql,Sql Server,Wcf,Service,Sqldatareader,这是我的服务代码: public List<Person> GetPersons() { string connstr = "Data Source=XXXXXX-PC;Initial Catalog=Database;Integrated Security=True"; using (SqlConnection con = new SqlConnection(connstr)) {
public List<Person> GetPersons()
{
string connstr = "Data Source=XXXXXX-PC;Initial Catalog=Database;Integrated Security=True";
using (SqlConnection con = new SqlConnection(connstr))
{
SqlCommand cmd = new SqlCommand("GetPersons", con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
SqlDataReader data = cmd.ExecuteReader();
List<Person> persons = new List<Person>();
Person one = new Person();
if (data.HasRows)
{
while(data.Read())
{
one.id = data.GetInt32(data.GetOrdinal("ID"));
one.name = data.GetString(data.GetOrdinal("Name"));
one.surname = data.GetString(data.GetOrdinal("Surname"));
one.fathername = data.GetString(data.GetOrdinal("FatherName"));
persons.Add(one);
}
data.Close();
}
return persons;
}
}
当存储过程结果中有行时,SqlDataReader
总是多次返回最后一行。我找不到问题所在。。。救命啊
编辑:存储过程按预期返回数据,但此问题仅存在于服务中。列表。添加添加对象引用。NET中的引用类型从不隐式复制。引用被复制。甚至没有一种复制对象的通用方法
为每行创建一个新对象。您调试程序了吗?单步执行时会发生什么情况?我无法单步执行异步调用,我需要这些调用,因为这是WP 8.1应用程序的一部分。在此方法中设置断点并单步执行。找到问题所在。显然,方法List.Add()并没有将对象复制到List中,相反,它只在列表中放置一个指向该对象的指针。现在很容易看到列表只有三个指向同一对象的成员。替换此行:人。添加(一);带此行:persons.Add(新的persons(一个.id,一个.name,一个.姓,一个.父名));谢谢usr!熟悉对象和对象引用之间的区别。C#在没有这种理解的情况下使用起来很混乱。您解决了问题,但尚未完全了解原因。不管怎么说,问题解决了真是太好了。
SELECT
tbtp.ID, tbo.Name, tbo.Surname, ISNULL(tbo.FatherName,'unknown') FatherName
FROM
tbTechCh tbtp
JOIN
tbPersons tbo ON tbtp.PersonsID = tbo.ID
WHERE
tbtp.DateCh IS NULL
ORDER BY
tbo.Surname