ข้อมูลไม่ได้รับการอัพเดตเป็นตาราง

ฉันกำลังพยายามใช้คุณสมบัติการเปลี่ยนรหัสผ่าน แต่ดูเหมือนว่าจะไม่ทำงาน

 private void button3_Click(object sender, EventArgs e)
    {

        using (OleDbConnection con = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\User\Desktop\esoft\gym\gym\bin\Debug\Clients.accdb"))
        {
            DataTable dt = new DataTable();
            con.Open();
            errorProvider1.Clear();
            if (dt.Rows[0][0].ToString() == "1")
            {
                if (textBox3.Text == textBox4.Text)
                {

                    OleDbDataAdapter da = new OleDbDataAdapter(" COUNT (*) FROM login WHERE username= '" + textBox1.Text + "' AND [password]='" + textBox2.Text + "' ", con);
                    OleDbCommand com = new OleDbCommand("UPDATE login SET [password] = '" + textBox3.Text + "' WHERE username = '" + textBox2.Text + "'", con);
                    com.ExecuteNonQuery();



                    MessageBox.Show("password successfully changed", "success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    errorProvider1.SetError(textBox3, "passwords dont match");
                    errorProvider1.SetError(textBox4, "passwords dont match");
                }
            }

            else
            {
                errorProvider1.SetError(textBox1, "wrong username");
                errorProvider1.SetError(textBox2, "wrong pasword");

            }

        }
    }

มีข้อผิดพลาดในบรรทัด if (dt.Rows[0][0].ToString() == "1") โดยระบุว่าไม่พบข้อมูลในตำแหน่งนั้น แต่มี 5 แถวในตารางข้อมูล

เมื่อโค้ดถูกรันโดยไม่มีบรรทัดด้านบน เช่น //if (dt.Rows[0][0].ToString() == "1")

รหัสทำงาน แต่ไม่มีการอัปเดตข้อมูลในตาราง

อัปเดตรหัสอีกครั้งและยังคงได้รับข้อผิดพลาดเดิม:

OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM login WHERE username= '" + textBox1.Text + "' AND [password]='" + textBox2.Text + "' ", con);
            DataTable dt = new DataTable();
            da.Fill(dt);
            con.Open();
            errorProvider1.Clear();
            if (dt.Rows[0][0].ToString() == "1")

person iboss    schedule 07.01.2016    source แหล่งที่มา
comment
ปัญหาใหญ่คือคุณกำลังพยายามจัดเก็บรหัสผ่าน อย่าทำอย่างนั้น!!!   -  person Mitch Wheat    schedule 07.01.2016
comment
ฉันคิดว่า con.read() หายไป   -  person null1941    schedule 07.01.2016
comment
คุณได้สร้างอินสแตนซ์ใหม่ของ DataTable โดยไม่ต้องกำหนดข้อมูลใดๆ ให้กับมัน!   -  person Salah Akbari    schedule 07.01.2016
comment
และไม่มีแบบสอบถามในข้อมูลโค้ดเพื่อเติม DataTable   -  person null1941    schedule 07.01.2016


คำตอบ (4)


ลองกรอก DataTable ของคุณดังต่อไปนี้ -

string cmdString = "SELECT * FROM login WHERE username= '" + textBox1.Text + "' AND [password]='" + textBox2.Text + "' ";
OleDbCommand cmd = new OleDbCommand(cmdString,con);
con.Open();
var dr = cmd.ExecuteReader();

DataTable dt = new DataTable();
dt.Load(dr);
con.Close()

ตอนนี้คุณควรได้รับข้อมูลของคุณในตาราง โดยมีเงื่อนไขว่าแบบสอบถามที่คุณเลือกถูกต้อง ตรวจสอบให้แน่ใจว่าคุณใช้ using บล็อกบนวัตถุการเชื่อมต่อและคำสั่งเพื่อกำจัดสิ่งเหล่านี้เมื่ออยู่นอกขอบเขต

person Yogi    schedule 07.01.2016
comment
นั่นไม่ได้ผลเช่นกัน :/ ยังคงได้รับข้อผิดพลาดเดิม (ไม่พบข้อมูล) เมื่อฉันป้อนชื่อผู้ใช้ผิดแทนที่จะแสดงผู้ให้บริการข้อผิดพลาด และเมื่อฉันพยายามเปลี่ยนรหัสผ่านของชื่อผู้ใช้ที่มีอยู่ ระบบแจ้งว่าบันทึกแล้ว แต่ไม่มีข้อมูลอัปเดตจริง - person iboss; 07.01.2016
comment
ตกลง. ตอนนี้ฉันยุ่งกับโค้ดมานานแล้วและไม่ว่าฉันทำยังไงก็ได้รับข้อผิดพลาดเดิมเสมอ ไม่พบข้อมูล ฯลฯ แต่ฉันแน่ใจว่าฉันมี 5 แถวในตารางข้อมูลของฉัน และรูปแบบอื่นๆ ทั้งหมดที่มีสตริงการเชื่อมต่อเดียวกันก็ทำงานได้ดี ยกเว้นอีกรูปแบบหนึ่งที่เป็นแบบฟอร์มอัปเดตด้วย แล้วเกิดอะไรขึ้นที่นี่... - person iboss; 07.01.2016

คุณแค่ประกาศตารางข้อมูล ไม่ได้กำหนดข้อมูลใดๆ

DataTable dt = new DataTable();

นั่นเป็นเหตุผลว่าทำไมเมื่อคุณพยายามรับ dt.Rows[0][0].ToString() มันทำให้เกิดข้อผิดพลาด

person Muhammad Atif    schedule 07.01.2016
comment
@iboss - อัปเดตคำถามของคุณพร้อมการเปลี่ยนแปลงและรายละเอียดข้อผิดพลาดที่คุณได้รับ - person Yogi; 07.01.2016

ในขณะที่คุณสามารถลองสิ่งนี้:

OleDbDataAdapter custDA = new OleDbDataAdapter();
     DataSet custDS = new DataSet();
     DataTable custTable = new DataTable("Customers");
     custTable.Columns.Add("CustomerID", typeof(String));
     custTable.Columns.Add("CompanyName", typeof(String));
     custDS.Tables.Add(custTable);
     //Use ADO objects from ADO library (msado15.dll) imported
     //  as.NET library ADODB.dll using TlbImp.exe
     ADODB.Connection adoConn = new ADODB.Connection();
     ADODB.Recordset adoRS = new ADODB.Recordset();
     adoConn.Open("Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;", "", "", -1);
     adoRS.Open("SELECT CustomerID, CompanyName FROM Customers", adoConn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1);
     custDA.Fill(custTable, adoRS);
     adoRS.Close();
     adoConn.Close();

คุณสามารถปฏิบัติตามข้อมูลอ้างอิงนี้

person Suvro    schedule 07.01.2016
comment
ขอบคุณสำหรับข้อมูลของคุณ แต่โปรเจ็กต์นี้เป็นส่วนหนึ่งของรายวิชาของฉัน และเราไม่ควรจะใช้สิ่งอื่นใดนอกจาก OleDb - person iboss; 07.01.2016

ตามที่ผู้อื่นระบุไว้ คุณไม่เคยกำหนดค่าให้กับตารางข้อมูล นั่นคือสาเหตุที่ทำให้ตารางข้อมูลติดขัด แบบสอบถามของคุณโดยการต่อสตริงจะเปิดให้คุณใช้ SQL-Injection ทำให้เป็นพารามิเตอร์ สุดท้ายนี้ สำหรับการสืบค้นของคุณ ฉันจะสืบค้นบันทึกทั้งหมดสำหรับ ID ผู้ใช้ที่ระบุ แต่รับค่าผู้ใช้และรหัสผ่านโดยยึดตามคุณสมบัติ ID ผู้ใช้เท่านั้น ไม่ใช่รหัสผ่าน ด้วยวิธีนี้ หากคุณส่งคืนแถวมากกว่า 1 แถว ระบบจะระบุบัญชีผู้ใช้ที่ซ้ำกันและควรได้รับความสนใจเป็นพิเศษ หากส่งคืน NO แถว แสดงว่าไม่มีผู้ใช้ดังกล่าว หากส่งคืนหนึ่งแถว คุณสามารถเปรียบเทียบกับรหัสผ่านที่ป้อนได้ และหากตรงกัน คุณจะมี ID ผู้ใช้ที่ถูกต้องเพื่อใช้งาน

เริ่มต้นด้วยของคุณ

using( OleDbConnection con = ...) 
{
   // create command first.. Parameterize it.  In this case "@" is parameter indicator
   // for Access.  parmUserName is the parameter name to be applied.  I explicitly added
   // "parm" in front to ensure differentiation between the parameter and actual column.
   var cmd = new OleDbCommand( 
               @"select password from login where username = @parmUserName", con);

   // Now, add the parameter of proper data type.  The name of the parameter and it's value
   cmd.Parameters.AddWithValue("parmUserName", textBox1.Text);

   // create your data adapter now based on the command above
   var da = new OleDbDataAdapter(cmd);

   // NOW, create your data table object and have data adapter query and fill with rows.
   var dt = new DataTable();
   da.Fill(dt);

   // NOW, check results.
   if (dt.Rows.Count == 0)
      MessageBox.Show("No such user account");
   else if( dt.Rows.Count > 1)
      MessageBox.Show("Duplicate user account");
   else
   {
      // valid single record. Do the passwords match?
      if (textBox3.Text.Equals(dt.Rows[0]["password"].ToString()))
      {
         MessageBox.Show("Valid login, allow to continue");

         // Now, since it appears you are trying to UPDATE the password for the user,
         // build new UPDATE command and parameterize it in a similar fashion
         var cmdUpd = new OleDbCommand(
                        @"update login set password = @parmNewPwd where username = @parmUserName", con);
         // Now, add the parameter of proper data type.  The name of the parameter and it's value
         cmd.Parameters.AddWithValue("parmNewPwd", textBox3.Text);
         cmd.Parameters.AddWithValue("parmUserName", textBox1.Text);
         if (cmd.ExecuteNonQuery() == 1)
            MessageBox.Show("Password updated");
         else
            MessageBox.Show("Failed updating password");
      }
      else
         MessageBox.Show("Invalid password");
   }
}

หมายเหตุสุดท้าย คุณควรพิจารณาการล้างข้อมูลโดยเฉพาะก่อนที่จะสร้างคำสั่ง SQL ไม่ต้องเชื่อมสตริงที่ผู้ใช้สามารถป้อนข้อมูลสำหรับ SQL-Injection ได้ด้วยตนเอง และกำหนดพารามิเตอร์ให้กับสตริงเหล่านั้น

person DRapp    schedule 08.01.2016