如何在c#中确定已存在的oracle数据库连接
本文关键字:存在 oracle 数据库连接 | 更新日期: 2023-09-27 18:10:09
假设我使用正确的凭据调用下面的方法:
private bool Connect(string username, string password)
{
string CONNSTRING = "Provider = MSDAORA; Data Source = ISDQA; User ID = {0}; Password = {1};";
OleDbConnection conn = new OleDbConnection();
string strCon = string.Format(CONNSTRING, username, password);
conn.ConnectionString = strCon;
bool isConnected = false;
try
{
conn.Open();
if (conn.State.ToString() == "Open")
isConnected = true;
}//try
catch (Exception ex)
{
lblErr.Text = "Connection error";
}//catch
finally
{
conn.Close();
}//finally
return isConnected;
}
我已经在下面的方法中成功打开了连接:
private bool ValidateUserCode(string usercode)
{
UserAccountDefine def = new UserAccountDefine();
UserAccountService srvc = new UserAccountService();
UserAccountObj obj = new UserAccountObj();
bool returnVal = false;
bool isValid = Connect(def.DB_DUMMY_USERCODE, def.DB_DUMMY_PASSWORD);
if (isValid)
{
obj.SQLQuery = string.Format(def.SQL_LOGIN, usercode.ToLower(), DateTime.Now.ToString("MM/dd/yyy"));
DataTable dt = srvc.Execute(obj, CRUD.READALL);
if (dt.Rows.Count == 1)
{
returnVal = true;
}
}
return returnVal;
}
问题是如何确定ValidateUserCode()
方法中的连接状态?之后我如何关闭它?
注意:我在UserAccountDefine();
中显式地声明了字符串变量,所以你不必担心。
我已经尝试在ValidateUserCode()
中声明一个新的OleDbConnection conn
,但conn.State
总是返回"Closed"
。
我有一个两层安全功能的系统。第一是应用程序,第二是数据库。当用户登录应用程序时,也使用该用户名和密码登录数据库。现在的场景是当用户忘记密码时,我们无法确定该用户的fullname
、email
和contact
(保存在数据库中)。我只知道他的usercode
。为了确定联系人的详细信息,我必须使用DUMMY_ACCOUNT
打开一个活动连接。
请注意,我从不在数据库中维护密码。
首先,在finally
块中调用Close()
,这意味着在第二个方法中的任何点,连接都将关闭。此外,即使您不Close()
它,因为conn
是Connect()
中的一个局部变量,当您回到ValidateUserCode()
时,连接已经开始进行垃圾收集,当它是 Dispose()
d时,它也会自动关闭。
我建议你要么使它成为一个成员,将它作为输出参数传递,通过Connect()
方法返回它(并返回null
失败,或者其他什么,如果你不喜欢异常)。或者重新设计代码。
private OleDbConnection Connect(string username, string password)
{
string CONNSTRING = "Provider = MSDAORA; Data Source = ISDQA; User ID = {0}; Password = {1};";
OleDbConnection conn = new OleDbConnection();
string strCon = string.Format(CONNSTRING, username, password);
conn.ConnectionString = strCon;
try
{
conn.Open();
if (conn.State.ToString() == "Open")
return conn;
}//try
catch (Exception ex)
{
lblErr.Text = "Connection error";
}//catch
finally
{
//you don't want to close it here
//conn.Close();
}//finally
return null;
}
我不确定这些信息对你有什么帮助。
我有类似的问题,而使用OLEDB连接的Excel阅读。我不知道答案。所以,我刚刚为OleDbConnection添加了一个初始化为null的全局变量。
在我的方法中,我用来检查null,如果没有关闭它,然后再次打开它。
if (con != null)
{
con.Close();
con.Dispose();
}
try
{
con = new OleDbConnection(connectionString);
}
catch (Exception ex)
{
MessageBox.Show("oledbConnection = " + ex.Message);
}
try
{
con.Open();
}
catch (Exception ex)
{
MessageBox.Show("connection open = " + ex.Message + "'n");
}
我可以在这之后继续。你可以试试,如果它对你有用,那很好!
我不确定我理解的问题是否正确。我的回答是基于您想要打开/检索连接,采取操作,然后关闭/释放连接的前提。
包含的代码做得不好。典型的DAO代码类似于这个伪代码,在我的例子中,它取自我使用的一些样板代码。
public DataSet FetchDataSet(string sql, IDictionary paramHash) {
var cnn = AcquireConnection();
var rtnDS = new DataSet();
try
{
var cmd = cnn.CreateCommand();
cmd.CommandText = sql;
SetParameters(cmd, paramHash);
IDbDataAdapter ida = new DataAdapter { SelectCommand = cmd };
LogSql(sql, paramHash, "FetchDataSet");
ida.Fill(rtnDS);
}
catch (Exception ex)
{
DebugWriteLn("Failed to get a value from the db.", ex);
throw;
}
finally
{
ReleaseConnection(cnn);
}
return rtnDS;
}
请注意,上面的代码严格是关于与数据库通信的。没有评估数据是对还是错。您可能有一个DAO,它是包含上述代码的DAO的子类,它可能这样做:
public MyItemType FindSomeValue(long Id)
{
const string sql = @"SELECT something from somewhere where id=:id";
var myParams = new Dictionary<string, long> { { "id", Id } };
var ds = FetchDataSet(sql, myParams);
return (from DataRow row in ds.Tables[0].Rows
select new Item
{
Id = Convert.ToInt64(row["ID"], CultureInfo.InvariantCulture),
Name = row["NAME"].ToString()
}).FirstOrDefault();
}
实际上,上面的伪代码来自一个我已经使用多年的DAO实现。它使数据访问相对轻松。请注意,这些方法背后有一些真正的代码,如SetParameters(30 - 80行左右),我有一堆其他受保护的方法,如FetchScalar, ExecuteSQL等。