2

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

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();因此您不必担心。

我已经尝试在 toOleDbConnection conn内部声明一个新的ValidateUserCode(),但conn.State总是返回"Closed"

更新

我有一个具有 2 层安全功能的系统。第一个在应用程序中,第二个在数据库中。如果用户登录到应用程序,用户名和密码也用于登录到数据库。现在,这种情况是当用户忘记他/她的密码时,我们无法确定用户的fullname,emailcontact(在数据库中维护)。我只知道他的usercode。要确定联系方式,我必须使用DUMMY_ACCOUNT.

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

4

3 回答 3

1

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

我在使用 OLEDB 连接进行 Excel 阅读时遇到了类似的问题。我不知道答案。所以,我只是为初始化为 null 的 OleDbConnection 添加了一个全局变量。

在我的方法中,我曾经检查过该空值,如果没有关闭它并再次打开它。

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

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

于 2013-04-19T08:23:06.057 回答
1

首先,你调用Close()你的finally块,这意味着在你的第二种方法中的任何时候,连接都会被关闭。此外,即使你不这样做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;
}
于 2013-04-22T12:06:43.323 回答
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 等。

于 2013-04-24T18:27:56.787 回答