【发布时间】:2019-07-31 20:48:08
【问题描述】:
我有两个数据库,一个是oracle数据库,另一个是sql server。在 oracle 中我至少有 300K,而在 sql server 中我有 400K 记录。我想检查sql server中是否存在oracle数据。我尝试使用每种方法检查oracle中的每条记录是否存在于sql server中,这需要很长时间。我问你是否有另一种方法会给我同样的结果。我正在使用 LINQ 进行查询
conn.Open();
cmd = new OdbcCommand()
{
Connection = conn,
CommandText = "select c_id, c_name,c_dob,c_email,c_pnumber from customers"
CommandType = CommandType.Text
};
OdbcDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
var customers = _db.tblCustomers.FirstOrDefaulst(x
=>x.C_ID.Equals(dr.GetValue(0))
if(customers !=null)
{
//do something
}
else
{
tblCustomers customer = new tblCustomers {
C_name = Convert.ToString(dr.GetValue(1)),
C_dob = Convert.ToString(dr.GetValue(2)),
C_email = Convert.ToString(dr.GetValue(3)),
C_pnumber = Convert.ToString(dr.GetValue(4))
}
}
}
P.S : 这只是为了添加新客户,但我有另一个具有相同逻辑的代码来更新记录,我应该每天运行这些方法
新增记录查询
var customers = _db.tblCustomers.FirstOrDefaulst(x
=>x.C_ID.Equals(dr.GetValue(0))
更新现有记录的查询
var customers = _db.tblCustomers.FirstOrDefaulst(x
=>x.C_ID.Equals(dr.GetValue(0)) && x.c_name == dr.GetValue(1) )
【问题讨论】:
-
加载两个数据库中的所有记录(即使只是在临时表中)。加入。
-
看起来您只是在比较记录的 ID。如果正确,请修改 SQL 语句以仅返回 ID,将 oracle DB 的所有 ID 放入 C# HashSet 中,然后迭代 MSSQL 结果并检查 ID 是否在您从 Oracle DB 创建的 HashSet 中跨度>
-
如果您能够管理 SQL 服务器,请考虑将 Oracle DB 添加为链接服务器。然后,繁重的工作可以由 DB 完成,而不必使用 C# 代码。
-
只是为了添加到@christoph 的评论中,如果可能的话,然后将逻辑放在 SQL Server 端的存储过程中,然后从中返回一个值,帮助您识别记录是否存在.然后只需使用 C# 调用该过程。
-
所以你的意思是我为oracle中存在的每条记录创建一个for循环,然后我调用一个存储过程来比较数据库中是否存在记录?所以存储过程将被调用 300K 次?!
标签: c# sql-server oracle