【发布时间】:2017-01-25 20:00:08
【问题描述】:
我不明白如何使用 OracleConnection 对象
将它用于所有查询?还是一个查询一个连接?
我的程序做:
1) 从 Oracle DB(光标)接收数据(~100.000 - 1.000.000 条记录)
2) 为每个选定的记录 (id) 更新另一个表中的值
什么是正确的:
1) 为每个查询创建 OracleConnection
using(OracleConnection connection = new OracleConnection(connectionString))
{
using(OracleCommand command = new OracleCommand(recieveSql, connection))
{
connection.Open();
...
command.ExecuteNonQuery();
...
using(OracleDataReader reader = command.ExecuteReader())
{
while(reader.Read())
{
int id = reader.GetInt32(0);
string value = reader.GetInt32(1);
UpdateRecord(id, value);
}
}
}
}
private void UpdateRecord(int id, string value)
{
using(OracleConnection connection = new OracleConnection(connectionString))
{
using(OracleCommand command = new OracleCommand(updateSql, connection))
{
connection.Open();
...
command.Parameters.AddWithValue("@id", id);
command.Parameters.AddWithValue("@value", value);
command.ExecuteNonQuery();
...
}
}
}
2) 对所有查询使用 1 个 OracleConnection
using(OracleConnection connection = new OracleConnection(connectionString))
{
using(OracleCommand command = new OracleCommand(recieveSql, connection))
{
connection.Open();
...
command.ExecuteNonQuery();
...
using(OracleDataReader reader = command.ExecuteReader())
{
while(reader.Read())
{
int id = reader.GetInt32(0);
string value = reader.GetInt32(1);
UpdateRecord(connection, id, value);
}
}
}
}
private void UpdateRecord(OracleConnection connection, int id, string value)
{
using(OracleCommand command = new OracleCommand(updateSql, connection))
{
...
command.Parameters.AddWithValue("@id", id);
command.Parameters.AddWithValue("@value", value);
command.ExecuteNonQuery();
...
}
}
【问题讨论】:
-
我会说所有这些更新打开 100.000 多个连接有明显的开销。但是,如果您没有为了这个问题而简化您的任务/代码,我会争论为什么要编写任何 C# 代码?从一个数据库到另一个数据库的简单 UPDATE 可以直接在 SQL 中完成。
-
因为我想有机会在保存到数据库之前从程序中更改价值或用它做一些事情主要我只是想学习 C# - Oracle 通信和我的程序没有做一些有用的事情.. .