0

こんにちは私はこの主題についてたくさん検索しました、そして私はユーザーによって行われたコーディングのほとんどを理解できないようです、「Boarland C ++ビルダー」に精通していてそれで良い経験を持っています、しかし私は到達できないようですMSVS C#2008の下部、誰でも、私の問題はログインSQLクエリにあります。それが正しい名前である場合、検索および検出されたソリューションはまったく機能しないようです。これが私のコードの一部です。

using System.Data.Sql;

using System.Data.SqlClient;

namespace DMSTestLoginForm

{

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        string connection = @"Data Source=.\SQLExpress;AttachDbFilename=|Data Directory is all set and ready to go|.mdf;Integrated Security=True;User Instance=True";
        SqlConnection con = new SqlConnection(connection);

        try
        {
            con.Open();
            //MessageBox.Show("Connection Successful");
        }
        catch (Exception)
        {
            //MessageBox.Show("Did not connect"); // connection is successful the issue is down bellow.
        }
    }

    private void lgnbtn_Click(object sender, EventArgs e)
    {
        string dummyun = uninput.Text;
        string dummypw = pwinput.Text;
        SqlCommand dummy1 = new SqlCommand("SELECT * FROM nurse WHERE n_id ='"+uninput.Text+"'");
        SqlCommand dummy2 = new SqlCommand("SELECT * FROM nurse WHERE n_pw = '"+pwinput.Text+"'");
        string dum = Convert.ToString(dummy1);
        string dum2 = Convert.ToString(dummy2);
        if((dum==dummyun)&&(dum2==dummypw))
            MessageBox.Show("Welcome in");        //this message is to test if i logged in or not.
            //Form2 Loggedin = new Form2;
            //Loggedin.Show();
       else
            MessageBox.Show("Login failed"); 

    }

問題は実際の接続文字列ではなく、前述のように、ユーザー名/パスワードがDB.tableに含まれているかどうかを確認するSQLクエリで説明しました。これは「ナース」であるかどうかにかかわらず、「文字列」インスタンスをたくさん作成したことは知っていますが、絶望的な状況になり、ソリューションプロバイダーに非常に感謝します。事前に感謝します。

4

3 に答える 3

3

Datareaderを使用してSqlCommandオブジェクトを実行する必要があります。パラメータ化されたクエリを使用してみてください。 SqlDatareader

private void lgnbtn_Click(object sender, EventArgs e)
    {
        string dummyun = uninput.Text;
        string dummypw = pwinput.Text;
        con.Open();

        using(SqlCommand StrQuer = new SqlCommand("SELECT * FROM nurse WHERE n_id=@userid AND n_pw=@password", con))
        {
           StrQuer.Parameters.AddWithValue("@userid",dummyun);
           StrQuer.Parameters.AddWithValue("@password",dummypw);
         SqlDataReader dr = StrQuer.ExecuteReader(); 
         If(dr.HasRows)
         {
           MessageBox.Show("loginSuccess");    
         }
        else
        {
          //invalid login
        } 
     }   
    }
于 2012-02-14T01:04:17.883 に答える
1

ASqlCommandはあなたが単に求めるものではありませんConvert.ToString。期待される結果を得るために呼び出す必要のあるメソッドがあります。

のようなメソッドを呼び出してExecuteReader、結果を読み戻す必要があります。また、クエリを2つの個別のクエリではなく、1つのクエリに変更する必要があります。最後に、@ SLaksが指摘しているように、sql-injectionに対して脆弱にしたくないので、クエリをパラメータ化されたクエリとして記述し、SqlCommandsParametersプロパティを介してパラメータを追加してみてください。

于 2012-02-14T00:59:01.690 に答える
-1

これは、ログインボタンの魔法のコードです。これにより、エラーメッセージ付きのラベルも表示されます。

private void btnlogin_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(@"PASTE_YoURCONNECTION_STRING_HERE"); 
            SqlDataAdapter usr = new SqlDataAdapter("SELECT COUNT(*) FROM login WHERE username='" + textBox1.Text + "'", con);
            SqlDataAdapter pswd = new SqlDataAdapter("SELECT COUNT(*) FROM login WHERE password='" + textBox2.Text + "'", con);
            DataTable dt1 = new DataTable(); //this is creating a virtual table  
            DataTable dt2 = new DataTable();
            usr.Fill(dt1);
            pswd.Fill(dt2);
            if (dt1.Rows[0][0].ToString() == "1" && dt2.Rows[0][0].ToString() == "1")
            {
                this.Hide();
                new mainform().Show();
            }
            else if (dt1.Rows[0][0].ToString() != "1" && dt2.Rows[0][0].ToString() != "1")
            {
                usrerror.Visible = true;
                pswrderror.Visible = true;
            }
            else if (dt1.Rows[0][0].ToString() == "1" && dt2.Rows[0][0].ToString() != "1")
            {
                usrerror.Visible = false;
                pswrderror.Visible = true;
            }
            else if (dt1.Rows[0][0].ToString() != "1" && dt2.Rows[0][0].ToString() == "1")
            {
                usrerror.Visible = true;
                pswrderror.Visible = false;
            }               
        } 

スクリーンショットを見る

于 2019-02-25T15:06:34.310 に答える