Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF SqlDataReader始终返回最后一行乘以所有行数_Sql_Sql Server_Wcf_Service_Sqldatareader - Fatal编程技术网

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