首页 > 解决方案 > 将 C# 中的列表与数据库中的表进行比较

问题描述

我需要将从 C# Windows 窗体创建的连续整数列表与整数数据库表进行比较,指示是否存在重复项。

我有一个可用的版本,如下所示,但我假设它可能是最不有效的方法 - 将 C# 列表与数据库表中的每个整数一一进行比较。

我是否应该将数据库中的整数导入 C#,然后进行比较?或者有没有sql的询问方式:

如果列表 A 中的任何项目包含在列表 B 中,等等....而不逐一比较每个数字?

我已经看到很多关于仅在数据库中查找 1 项的意见,但我需要一种有效的方法来将有时 5,000 或更多的 C# 列表与最终可能有数十万条记录的数据库表进行比较。

public static string VerifyManufacturingSerialOnly(int count, int beginning)
        {
            string duplicateSerials = "";
            int currentSerial = beginning;

            for (int i = 0; i < count; i++)
            {
                OleDbConnection connection = BadgeDatabaseDB.GetConnection();
                string checkStatement
                    = "SELECT * "
                    + "FROM SerialNumbersMFG "
                    + "WHERE SerialNumber = @CurrentSerial";
                OleDbCommand command =
                    new OleDbCommand(checkStatement, connection);
                command.Parameters.AddWithValue("@CurrentSerial", currentSerial);                

                try
                {
                    connection.Open();
                    OleDbDataReader dataReader =
                        command.ExecuteReader(CommandBehavior.SingleRow);
                    if (dataReader.Read())
                    {
                        duplicateSerials +=
                            "Serial # " +
                            currentSerial +
                            " already exists in order # " +
                            dataReader["OrderNumber"].ToString() + "\n";
                    }
                    else {  }
                }
                catch (OleDbException ex)
                {
                    throw ex;
                }
                finally
                {
                    connection.Close();
                }
                currentSerial++;
                i++;
            }
            return duplicateSerials;

标签: c#sql

解决方案


两种方式:

  1. 从数据库 SELECT 中获取所有 id SerialNumber FROM SerialNumbersMFG,然后您可以使用 linqlist1.Intersect(list2)
  2. 正如评论中所发布的,大多数数据库都有该IN子句,因此您可以使用如下查询:SELECTSerialNumber FROM SerialNumbersMFG WHERE SerialNumber IN (1,2,3...)这也将执行所需的操作。

既然您提到数据库可以有数十万条记录,我建议第二种方式更好。请stringbuilder用于连接。


推荐阅读