如何在C#中确定现有的oracle数据库连接?

时间:2013-04-19 06:12:42

标签: c# oracle oracle11g database-connection

假设我使用正确的凭据调用以下方法:

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();中明确声明了字符串变量,因此您不必担心这一点。

我已尝试在OleDbConnection conn内声明新的ValidateUserCode(),但conn.State始终返回"Closed"

更新

我有一个具有2层安全功能的系统。第一个是应用程序,第二个是数据库。如果用户登录到应用程序,则用户名和密码也用于将他/她登录到数据库。现在,情况是当用户忘记了他/她的密码时,我们无法确定用户的fullnameemailcontact(在数据库中维护)。我只知道他的usercode。要确定联系人详细信息,我必须使用DUMMY_ACCOUNT打开活动连接。

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

3 个答案:

答案 0 :(得分:1)

我不确定这些信息对您有何帮助。

使用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");
        }

我可以在此之后继续。你可以尝试,如果它对你有用它的好处!

答案 1 :(得分:1)

首先,您在Close()块中调用finally,这意味着在第二种方法的任何一点,连接都将被关闭。此外,即使您不Close(),因为connConnect()中的本地变量,当您回到ValidateUserCode()时,连接垃圾收集已经开始了,当它Dispose()时,它也会自动关闭。

我建议您将其设为成员,将其作为out参数传递,通过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;
}

答案 2 :(得分:0)

我不确定我是否正确地回答了这个问题。我的回答是基于你想要打开/检索连接,采取行动,然后关闭/释放连接的前提。

您提供的代码效果不佳。典型的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等。