【发布时间】:2014-08-07 22:52:40
【问题描述】:
我的任务是在另一个供应商生成的 CSV 文件和超过 300 个独立但结构相同的 CRM 数据库之间创建数据同步过程。所有 CRM 数据库都在同一个 SQL Server 实例中定义。具体如下:
源数据将是一个 CSV,其中包含客户选择加入营销通信的所有电子邮件地址的列表。此 CSV 文件将在每晚完整发送,但将包含记录级别的日期/时间戳,这将允许我仅选择自上次处理周期以来已修改的那些记录。 CSV 文件可能包含数十万行,但每天的预期变化量将大大低于此值。
我将从 CSV 中选择数据,并将每一行转换为自定义 List<T> 对象。
查询 CSV 并转换数据后,我需要将此 List<T> 的内容与 CRM 数据库进行比较。这是因为 CSV 文件中包含的任何给定电子邮件地址都可能:
- 300 个数据库中的任何个数据库中都不存在
- 存在于 300 个数据库之一中
- 存在于多个数据库中
如果主 CSV 列表中的电子邮件地址与任何 CRM 数据库匹配,则匹配的 CRM 记录将使用 CSV 文件中包含的值进行更新。
在一个很高的、非常通用的层面上,我想我必须做这样的事情:
foreach(string dbName in masterDatabaseList)
{
//open db connection
foreach(string emailAddress in masterEmailList)
{
//some helper method that would execute a SQL statement like
//"IF EXISTS ... WHERE EMAIL_ADDRESS = <emailAddress>" return true;
bool matchFound = EmailExistsInDb(emailAddress)
if (matchFound )
{
//the current email from the master list does exist in this database
//do necessary updates and stuff
}
}
}
这是最有效的方法吗?我并不热衷于访问 300 个数据库可能数千次以查看主 CSV 列表中的每封电子邮件是否存在。理想情况下,我想生成一条 SQL 语句:
"SELECT * FROM EMAIL_TABLE WHERE EMAIL_ADDRESS IN(email1,email2, email3,...)"
这将允许对数据库执行单个查询,但我不知道这种方法是否会更好/更有效,特别是因为我必须动态生成 SQL 并且可能会打开它注射。
在这种情况下,最佳做法是什么?因为我有 300 个数据库需要每次进行比较,所以我正在寻找一种能够以最少的处理时间产生最佳结果的方法。在我的生产代码中,我将实现一种多线程方法,以便可以同时处理多个数据库,因此任何方法都需要是线程安全的。
【问题讨论】:
标签: c# sql database linq data-access