我认为最有效的方法是创建一个通用模型类来存储每个用户。像这样……
public class User
{
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
public string Country { get; set; }
// This comparer will be used to find records that exist or don't exist.
public class KeyFieldComparer : IEqualityComparer<User>
{
public bool Equals(User u1, User u2)
{
return u1.Name == u2.Name && u1.Surname == u2.Surname;
}
public int GetHashCode(User u)
{
return u.Name.GetHashCode() ^ u.Surname.GetHashCode();
}
}
}
现在将 CSV 文件和 Oracle 表都加载到 List<User> 对象中...
List<User> csvList;
List<User> oracleList;
当两个列表都填充了数据时,很容易查看每个列表中已经存在的内容,而不是访问数据库...
// This will filter users that are in the CSV file that don't already exist in oracle.
var newUsers = csvList.Except(oracleList, new User.KeyFieldComparer());
然后您可以遍历每个新用户并插入它们...
foreach (var newUser in newUsers)
InsertNewUser(newUser);
希望这有帮助。
更新:
我最喜欢的将数据从数据库加载到列表的方法是使用微 ORM,例如 Insight.Database。只需在 nuget 中搜索 Insight.Database 并安装显示 Insight.Database.Providers.Oracle 的那个。然后您可以像这样将表查询到内存中...
List<User> oracleList;
using (var db = new OracleConnection(ConnectionString))
{
oracleList = db.QuerySql<User>("SELECT Name, Surname, Age, Country FROM Users");
}
只要您的类模型中的属性与您选择的列的名称匹配,它就会正确映射它们(不区分大小写)。