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();ので、心配する必要はありません。

OleDbConnection conn私はすでに to内で new を宣言しようとしValidateUserCode()ましたが、conn.State常に返され"Closed"ます。

アップデート

2 層セキュリティ機能を備えたシステムを使用しています。1 つ目はアプリケーション、2 つ目はデータベースです。ユーザーがアプリケーションにログインする場合、ユーザー名とパスワードはデータベースへのログインにも使用されます。ここでのシナリオは、ユーザーが自分のパスワードを忘れた場合で、ユーザーの(データベースに保持されている)fullnameemailを判別できません。contact私はちょうど彼を知っていusercodeます。連絡先の詳細を確認するには、 を使用してアクティブな接続を開く必要がありDUMMY_ACCOUNTます。

データベース内にパスワードを保持することは決してないことに注意してください。

4

3 に答える 3

1

この情報がどのように役立つかわかりません。

Excelの読み取りにOLEDB接続を使用しているときに、同様の問題が発生しました。答えはわかりませんでした。そのため、null に初期化された OleDbConnection のグローバル変数を追加しました。

私の方法では、その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");
        }

この後も続けることができました。それがあなたのために働くなら、あなたはそれを試すことができます!

于 2013-04-19T08:23:06.057 に答える
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 に答える