data tidak diperbarui ke tabel

Saya mencoba menerapkan fitur perubahan kata sandi tetapi sepertinya tidak berhasil.

 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");

            }

        }
    }

terdapat error pada baris if (dt.Rows[0][0].ToString() == "1") yang menyatakan tidak ditemukan data pada posisi tersebut, padahal pada tabel data terdapat 5 baris.

ketika kode dijalankan tanpa baris di atas, seperti pada //if (dt.Rows[0][0].ToString() == "1")

kode berjalan tetapi tidak ada data yang diperbarui dalam tabel.

memperbarui kode lagi dan masih menerima kesalahan yang sama:

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 sumber
comment
Masalah yang lebih besar adalah Anda mencoba menyimpan kata sandi. JANGAN LAKUKAN ITU!!!   -  person Mitch Wheat    schedule 07.01.2016
comment
con.read() menurut saya tidak ada   -  person null1941    schedule 07.01.2016
comment
Anda baru saja membuat instance baru dari DataTable tanpa menugaskan data apa pun ke dalamnya!   -  person Salah Akbari    schedule 07.01.2016
comment
dan tidak ada query pada cuplikan kode untuk mengisi DataTable   -  person null1941    schedule 07.01.2016


Jawaban (4)


Coba isi DataTable Anda sebagai berikut -

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()

Sekarang Anda harus mendapatkan data Anda dalam tabel, asalkan kueri pemilihan Anda benar. Pastikan Anda menggunakan blok using pada objek koneksi dan perintah untuk membuangnya ketika berada di luar cakupan.

person Yogi    schedule 07.01.2016
comment
itu juga tidak berhasil :/ masih mendapatkan kesalahan yang sama (data tidak ditemukan) ketika saya memasukkan nama pengguna yang salah alih-alih menampilkan penyedia kesalahan. dan ketika saya mencoba mengubah kata sandi dari nama pengguna yang ada dikatakan disimpan tetapi tidak ada data yang diperbarui. - person iboss; 07.01.2016
comment
Oke. Saya sudah lama mengotak-atik kode dan apa pun yang saya lakukan, saya selalu mendapatkan kesalahan yang sama, tidak ada data yang ditemukan, dll. tapi saya telah memastikan bahwa saya memiliki 5 baris di tabel data saya dan semua formulir lain dengan string koneksi yang sama berfungsi dengan baik. kecuali satu formulir lain yang juga merupakan formulir pembaruan. jadi apa yang terjadi di sini... - person iboss; 07.01.2016

Anda hanya mendeklarasikan tabel data, tidak menugaskan data apa pun

DataTable dt = new DataTable();

itu sebabnya ketika Anda mencoba untuk mendapatkan dt.Rows[0][0].ToString() itu memberikan kesalahan

person Muhammad Atif    schedule 07.01.2016
comment
@iboss - Perbarui pertanyaan Anda dengan perubahan, dan detail kesalahan yang Anda dapatkan. - person Yogi; 07.01.2016

Bagaimana Anda dapat mencoba ini:

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();

Anda dapat mengikuti referensi ini

person Suvro    schedule 07.01.2016
comment
terima kasih atas masukan Anda, tetapi proyek ini adalah bagian dari tugas kuliah saya dan kami tidak boleh menggunakan apa pun selain OleDb. - person iboss; 07.01.2016

Seperti yang dicatat oleh orang lain, Anda tidak pernah memberikan nilai ke tabel data, itulah sebabnya tabel tersebut tersendat. Kueri Anda sendiri, dengan penggabungan string akan membuka Anda ke Injeksi SQL. Parameterisasikan itu. Terakhir, untuk kueri Anda, saya akan menanyakan semua catatan untuk ID pengguna tertentu, tetapi mendapatkan nilai pengguna dan kata sandi hanya berdasarkan kualifikasi ID pengguna, bukan kata sandi. Dengan cara ini, jika Anda memiliki lebih dari 1 baris yang dikembalikan, ini akan menunjukkan akun pengguna duplikat dan harus mendapat perhatian khusus. Jika ia mengembalikan TIDAK ada baris, maka tidak ada pengguna seperti itu. Jika ia mengembalikan SATU baris, maka Anda dapat membandingkannya dengan kata sandi yang dimasukkan dan jika cocok, Anda memiliki ID pengguna yang benar untuk dijalankan.

dimulai dengan milikmu

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");
   }
}

CATATAN AKHIR. Anda juga harus mempertimbangkan pembersihan data terutama sebelum membuat perintah SQL. Jangan pernah menggabungkan string di mana pengguna dapat memasukkan data secara manual untuk Injeksi SQL, buat parameternya.

person DRapp    schedule 08.01.2016