【发布时间】:2016-10-20 21:16:43
【问题描述】:
在下面的 OracleDataReader 循环代码下调用另一个连接时,我遇到会话未关闭的问题
private ArrayList GetORA()
{
ArrayList arr = new ArrayList();
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User ID=kcdev2usr;Password=password;ENLIST=FALSE;Pooling=true;Max Pool Size=20;";
const string queryString = "select * from MASTER_TABLE";
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand command = new OracleCommand(queryString, connection);
connection.Open();
OracleDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
try
{
while (reader.Read())
{
Master m = new Master();
m.ID = reader["ID"].ToString();
m.obj = GetAnother(reader["SOME"].ToString());
arr.Add(m);
}
}
finally
{
reader.Close();
}
}
return arr;
}
private Object GetAnother(string some)
{
// Do something
string getNextID = PutSome(some);
//=====
Object obj = null;
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User ID=kcdev2usr;Password=password;ENLIST=FALSE;Pooling=true;Max Pool Size=20;";
const string queryString = "SELECT PAGE_NAME FROM ANOTHER_TABLE WHERE ID=:ID";
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand command = new OracleCommand(queryString, connection);
command.Parameters.Add("ID",getNextID);
connection.Open();
OracleDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
try
{
while (reader.Read())
{
obj = CreateObj(dr["PAGE_NAME"].ToString());
}
}
finally
{
reader.Close();
}
}
return obj;
}
然后,..我尝试像这样将问题方法移出循环
private ArrayList GetORA()
{
ArrayList arr = new ArrayList();
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User ID=kcdev2usr;Password=password;ENLIST=FALSE;Pooling=true;Max Pool Size=20;";
const string queryString = "select * from MASTER_TABLE";
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand command = new OracleCommand(queryString, connection);
connection.Open();
OracleDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
try
{
while (reader.Read())
{
Master m = new Master();
m.ID = reader["ID"].ToString();
m.Some = reader["SOME"].ToString();
arr.Add(m);
}
}
finally
{
reader.Close();
}
foreach (var item in arr)
{
item.obj = GetAnother(item.Some);
}
}
return arr;
}
所有的 oracle 会话都正确无误,为什么?
- 我觉得我的代码不好,但我想知道 ODP.Net 管理 oracle 会话有什么不同。
ps。我使用“Oracle.DataAccess.dll”版本 4.121.2.0
【问题讨论】: