如何保存从查询中检索到的数据

本文关键字:检索 数据 查询 何保存 保存 | 更新日期: 2023-09-27 17:57:03

我之前问过这个问题并得到了编写查询的最佳方法的答案,但问题是,如果您必须将此结果保存在列表中,则记录重复。例如给定示例的连接的结果表

看到有重复的行。如何过滤掉它们,同时保存订单号的数据?当然可能有一些方法,但我正在寻找一些好方法

我们如何将数据存储在列表中而不在列表中创建重复的行?

我目前的表代码是

  int lastUserId = 0;
  sql_cmd = new SqlCommand();
  sql_cmd.Connection = sql_con;
  sql_cmd.CommandText = "SELECT * FROM AccountsUsers LEFT JOIN Accounts ON AccountsUsers.Id = Accounts.userId ORDER BY AccountsUsers.accFirstName";
  SqlDataReader reader = sql_cmd.ExecuteReader();
  if (reader.HasRows == true)
  {
      Users userToAdd = new Users();
      while (reader.Read())
      {
           userToAdd = new Users();
           userToAdd.userId = int.Parse(reader["Id"].ToString());
           userToAdd.firstName = reader["accFirstName"].ToString();
           userToAdd.lastName = reader["accLastName"].ToString();
           lastUserId = userToAdd.userId;
           Websites domainData = new Websites();
           domainData.domainName = reader["accDomainName"].ToString();
           domainData.userName = reader["accUserName"].ToString();
           domainData.password = reader["accPass"].ToString();
           domainData.URL = reader["accDomain"].ToString();
           userToAdd.DomainData.Add(domainData);
           allUsers.Add(userToAdd);
       }
    }

对于第二个表,我有自定义列表,它将保存第二个表中所有数据的条目。

返回的表

是具有联接的表,并且具有相同的多行

如何保存从查询中检索到的数据

除了使用安东尼奥·巴库拉回答的字典思想......

如果保留用户字典并多次调用示例中的代码,则应考虑用户帐户是新的、修改的或删除的。

执行 SQL 查询时要使用的算法如下:

  1. 如果查询结果中的行不在字典中,则创建新用户并将其添加到字典中。
  2. 如果查询结果中的行在字典中,请更新用户信息。
  3. 如果字典项不在查询结果中,则从字典中删除用户。

我还建议不要使用 SELECT *
仅使用代码所需的表列,这可以提高代码的性能,并通过返回私有用户信息来防止潜在的安全漏洞。

我不确定为什么不在SQL中使用不同的子句来获取唯一的结果。 那也会更快。 您是否考虑过使用哈希表。

我会将用户放入字典并检查 allready 是否存在,如下所示:

Dictionary<int, Users> allUsers = new Dictionary<int, Users>()

然后在阅读器中循环:

int userId = int.Parse(reader["Id"].ToString());
Users currUser = allUsers[userId];
if (currUser == null)
{
  currUser = new Users();
  currUser.userId = userId);
  currUser.firstName = reader["accFirstName"].ToString();
  currUser.lastName = reader["accLastName"].ToString();
  allUsers.Add(userID, currUser);
}
Websites domainData = new Websites();
domainData.domainName = reader["accDomainName"].ToString();
domainData.userName = reader["accUserName"].ToString();
domainData.password = reader["accPass"].ToString();
domainData.URL = reader["accDomain"].ToString();
currUser.DomainData.Add(domainData);

似乎问题的根源在于数据库表。当您说重复的数据行时,您是在说列表中有重复的条目还是表中有重复的数据?

给出 2 行重复。

两个选项:首先,通过使用不同的子句来防止从 sql 中提取重复数据,如下所示: 选择"不同于位置"

安东尼奥提到的第二种选择是检查列表是否已经有它。

除非有其他原因,否则建议使用第一个选项。