0

私が持っているコードのビットに問題があります。呼び出しているメソッド内に変数が詰まっていると思います。そのメソッドを再度実行すると、変数は存在しなくなります。

以下は私のメインの例です:

        public partial class Login : Form
{

    public Login()
    {
        InitializeComponent();
    }
    sqlconnect sql = new sqlconnect();
    public string pass;
    public string user;


    public void button1_Click(object sender, EventArgs e)
    {
        //Username and password textboxes send to public strings
        user = textBox1.Text;
        pass = textBox2.Text;

            try
            {
                //try connecting to SQL database using SQL class
                sql.GetSqlConnection();
                sql.myConnection.Open();
                this.Hide();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

SQL接続クラスは次のとおりです。

    namespace NHS_Workshop_System
         {

public class sqlconnect
{
    public SqlConnection myConnection { get; set; }
    Settings1 set = new Settings1();
    Login var = new Login();

    public SqlConnection GetSqlConnection()
    {
        if (myConnection == null)
            myConnection = new SqlConnection("user id="+(var.user)+"; password="+(var.pass)+";server="+(set.SelectServer)+";Trusted_Connection="+(set.SelectContype)+";database="+(set.SelectDataBase)+"; connection timeout="+(set.Condrop)+"");

        return myConnection;
    }


}

}

したがって、ログインしようとすると最初は機能する可能性がありますが、別のフォームでそのメソッドを実行しようとすると、ユーザー名とパスワードが欠落しています。メソッドを実行するたびに必ずそれらの詳細を呼び出すように、変数をグローバルにする方法がわかりません。したがって、2回目に別のフォームでsqlconnectionを使用すると、exメッセージにユーザー名とパスワードが存在しないことが示されます。これはスコーピングの問題ですか?そうであれば、誰かがこれをどのように行うかについて光を当てることができますか?SQLサーバーにアクセスするための新しい方法かもしれませんか?髪を引き裂いてくれてありがとう

4

1 に答える 1

1

以下はあなたの質問に対するあなたの現在の答えです。ただし、クラスロジックはあまり良くないように思われるため、自分が何をしているのかを考えることを強くお勧めします。シングルトンを実装しようとしているのは良いことですが、必要に応じてsqlconnectのインスタンスをさらに作成することもできます。


Loginクラスで、Loginのこのインスタンスを渡して、sqlconnectorがユーザーを認識し、ここで宣言されているパスを渡します。

public partial class Login : Form
{

// Old style - sqlconnect sql = new sqlconnect();
sqlconnect sql;
public string pass; // These arent declared and wont be of use for your sql connect class
public string user;

public Login( String pass, String user )
{
    this.pass = pass;
    this.user = user;
    // Now that we have a login with declared variables, pass it to the sqlconnect object
    this.sql = new sqlconnect(this);
    InitializeComponent();
}

これで、sqlconnectクラスで、Login変数が空になる前に。これで、コンストラクターに変数が設定されたインスタンスを受け取りました。

public class sqlconnect
{
    public SqlConnection myConnection { get; set; }
    Settings1 set = new Settings1();
    // Here you maked a new one, use the existing instead from which this class is called.
    // changed variable named from var to login..
    Login login; 


    // *NEW* Constructor where you pass your login object
    public sqlconnect(Login login)
    {
        this.login = login;
    }

    public SqlConnection GetSqlConnection()
    {
        if (myConnection == null)
            myConnection = new SqlConnection("user id="+(login.user)+"; password="+(login.pass)+";server="+(set.SelectServer)+";Trusted_Connection="+(set.SelectContype)+";database="+(set.SelectDataBase)+"; connection timeout="+(set.Condrop)+"");

        return myConnection;
    }


}
于 2012-11-14T13:22:57.393 に答える