1

私が作成した社内アプリケーションの設計、フレームワーク、およびほとんどのコードが完成しました。非表示のネットワーク ドライブにある Access データベースに保存されているデータにアクセス、表示、更新する 3 つの完全に異なる形式に変換される機能を追加しようとしています。

私が持っている質問の関連情報は次のとおりです... 1) ユーザーはアプリケーションを起動し、現在ログインしているユーザー名を収集して表示し、続行するかどうかを尋ねます。2) 続行することを選択すると、コードは MS Access データベース内のエージェント テーブルを検索して、エージェントの名前に対して作成されたレコードがあるかどうかを確認します。3) レコードが (現在) 存在する場合、フォームは閉じ、データ入力フォームに戻り、ユーザー名のみを表示する情報の入力を開始します。4) レコードが存在しない場合、別のフォームが開き、ユーザーが詳細を入力します。マネージャー、シフトの開始時刻と終了時刻、およびその AgentID 5) エージェントの詳細が保存されると、アプリケーションはデータ入力フォームに戻り、情報の入力を開始します。

このコードで達成したいこと... 手順 3) で、ユーザー名に一致するレコードが正常に見つかった後、一致する行の値を AgentID 列に返します。データベースには、AgentID を特定の役割に一致させるルックアップ フィールドがあります。これを後で使用して、ユーザーの役割に基づいて別の名前のフォームを表示します。今のところ、対応する行から AgentID を取得し、作成した静的クラス変数に値を保存して、他の既存のフォームで利用できるようにしたいと考えています。

参照用の using ステートメント

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Security.Principal;

理解したいコードは、If 関数内にあります。このコードは、ユーザーが Agent テーブルにエントリを持っているかどうかを正しく識別し、そうでない場合は、ユーザーをフォームに送信してエントリを作成します。

private void button1_Click(object sender, EventArgs e)
    {
        // set FNameLabel to user's name without domain
        FNameLabel.Text = WindowsIdentity.GetCurrent().Name.Split('\\')[1];
        // create OleDb connection and command, @name for agent name variable
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.jet.oledb.4.0;data source=\\myserver\hidden$\database.mdb");
        OleDbCommand cmd = new OleDbCommand("SELECT * FROM Agent WHERE AgentName=@name");
        // create command connection and set parameters
        cmd.Connection = con;
        cmd.Parameters.AddWithValue("@name", FNameLabel.Text);
        con.Open();
        OleDbDataReader read = cmd.ExecuteReader();
        // If there is a record that matches Agent Name, return to previous form
        if (read.Read() == true)
        {
            // MessageBox.Show("agent name in database");

            // If Agent Name matches, return Agent ID, passed to custom class variable
            // Class variable for Agent ID
            // AgentID.Var = [some variable that contains AgentID where AgentName = current user]
            this.Close();
            return;

        }
        // If there is no record that matches Agent Name, open form to enter Agent details
        // MessageBox.Show("agent name NOT in database");
        AgentInfo agents = new AgentInfo();
        agents.ShowDialog();
        this.Close();



    }

クラス変数は問題なく動作します

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataEntry
{
static class AgentID
{
    private static string agentid = "";

    public static string Var
    {
        get 
        { 
            return agentid; 
        }
        set 
        { 
            agentid = value; 
        }
    }
}

}

4

1 に答える 1

1

コードを1行追加してSELECTステートメントを変更することで、この問題を解決しました

OleDbCommand cmd = new OleDbCommand("SELECT AgentName, AgentID FROM Agent WHERE AgentName=@name");

次に、If 関数内にこの行を追加しました

AgentID.Var = read[1].ToString();

* を必要な 2 つの列 (AgentName と AgentID) に変更することで、それらを列 0 と 1 に割り当てました。列 0 の AgentName と列 1 の AgentID。次に、カスタム変数を取得し、その値を割り当てました。 if (read.Read() == true) にネストされた true (read[1]) が返された後、列 1 から読み取ります。また、この場合は数値ですが、値を文字列に割り当てて、文字列変数クラスに渡すようにしました。

その結果、AgentID クラスを呼び出して、開いているフォームに関係なく、いつでもアプリケーション内の任意の場所で .Var に割り当てられた値を取得できるようになりました。

2 いいね :)

于 2012-11-20T02:13:36.690 に答える