我需要将C#Windows窗体创建的顺序整数列表与整数数据库表进行比较,以指示是否存在重复项。
下面我有一个可行的版本,但是我认为这可能是最不高效的方法-将C#列表与数据库表中的每个整数一一比较。
我应该将数据库中的整数放入C#中,然后进行比较吗?还是有一种SQL方式询问:
如果列表A中的任何项目包含在列表B中,等等。。。而没有一个一个地比较每个数字?
关于在数据库中查找一项,我已经看到了很多意见,但是我需要一种有效的方法,将有时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;
答案 0 :(得分:0)
两种方法:
SerialNumber FROM SerialNumbersMFG
获取所有ID,然后可以使用linq list1.Intersect(list2)
IN
子句,因此您可以使用类似SELECTSerialNumber FROM SerialNumbersMFG WHERE SerialNumber IN (1,2,3...)
的查询,它也可以完成所需的工作。由于您提到DB可以拥有数十万条记录,所以我建议第二种方法更好。请使用stringbuilder
进行串联。