如何在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"

我有一个两层安全功能的系统。第一是应用程序,第二是数据库。当用户登录应用程序时,也使用该用户名和密码登录数据库。现在的场景是当用户忘记密码时,我们无法确定该用户的fullnameemailcontact(保存在数据库中)。我只知道他的usercode。为了确定联系人的详细信息,我必须使用DUMMY_ACCOUNT打开一个活动连接。

请注意,我从不在数据库中维护密码。

如何在c#中确定已存在的oracle数据库连接

首先,在finally块中调用Close(),这意味着在第二个方法中的任何点,连接都将关闭。此外,即使您不Close()它,因为connConnect()中的一个局部变量,当您回到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等。