从数据表更新列表框中的数据

时间:2017-06-01 13:19:16

标签: c# sql ms-access listbox ado.net

我想使用列表框在form_load上显示数据表中的数据,然后通过“插入”命令更新按钮单击列表框中的数据。功能就是fill_List()。这是我的代码:

    OleDbConnection konekcija;
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    DataTable dt = new DataTable();

    public Form2()
    {
        InitializeComponent();
        string putanja = Environment.CurrentDirectory;
        string[] putanjaBaze = putanja.Split(new string[] { "bin" }, StringSplitOptions.None);
        AppDomain.CurrentDomain.SetData("DataDirectory", putanjaBaze[0]);
        konekcija = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=|DataDirectory|\B31Autoplac.accdb");
    }

    void fill_List()
    {
        konekcija.Open();
        OleDbCommand komPrikaz = new OleDbCommand("SELECT * FROM GORIVO ORDER BY GorivoID ASC", konekcija);
        adapter.SelectCommand = komPrikaz;
        adapter.Fill(dt);
        listBox1.Items.Clear();
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            string pom;
            pom = dt.Rows[i][0].ToString() + " " + dt.Rows[i][1].ToString() + " " + dt.Rows[i][2];
            listBox1.Items.Add(pom);
        }
        konekcija.Close();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        fill_List();
    }

private void btnUpisi_Click(object sender, EventArgs e)
    {
        string s1, s2, s3;
        s1 = tbSifra.Text;
        s2 = tbNaziv.Text;
        s3 = tbOpis.Text;

        string Upisi = "INSERT INTO GORIVO (GorivoID, Naziv, Opis) VALUES (@GorivoID, @Naziv, @Opis)";
        OleDbCommand komUpisi = new OleDbCommand(Upisi, konekcija);
        komUpisi.Parameters.AddWithValue("@GorivoID", s1);
        komUpisi.Parameters.AddWithValue("@Naziv", s2);
        komUpisi.Parameters.AddWithValue("@Opis", s3);

        string Provera = "SELECT COUNT (*) FROM GORIVO WHERE GorivoID=@GorivoID";
        OleDbCommand komProvera = new OleDbCommand(Provera, konekcija);
        komProvera.Parameters.AddWithValue("@GorivoID", s1);

        try
        {
            konekcija.Open();
            int br = (int)komProvera.ExecuteScalar();
            if(br==0)
            {
                komUpisi.ExecuteNonQuery();
                MessageBox.Show("Podaci su uspesno upisani u tabelu i bazu.", "Obavestenje");
                tbSifra.Text = tbNaziv.Text = tbOpis.Text = "";
            }
            else
            {
                MessageBox.Show("U bazi postoji podatak sa ID = " + tbSifra.Text + ".", "Obavestenje");
            }
        }
        catch (Exception ex1)
        {
            MessageBox.Show("Greska prilikom upisa podataka. " + ex1.ToString(), "Obavestenje");
        }
        finally
        {
            konekcija.Close();
            fill_List();
        }
    }

而不是这个 Picture with my code

它向我展示了这一点(添加了重复的新数据) Picture how it should be

我的功能或其他地方有问题吗?

2 个答案:

答案 0 :(得分:2)

全局变量引起的另一个错误。
您正在为fill_list方法填充的DataTable保留一个全局变量。当您调用fill_list时,此数据表永远不会重置为空,因此在每次调用时,您都会向数据表中添加另一组行,然后在列表框中传输此数据。使用局部变量。

但同样的规则也应适用于OleDbConnection和OleDbCommand。没有必要保留它们的全局实例。创建一个对象非常快,避免全局变量的便利性比创建连接或命令实例的小麻烦要好。

void fill_List()
{
    using(OleDbConnection konekcija = new OleDbConnection(......))
    using(OleDbCommand komPrikaz = new OleDbCommand("SELECT * FROM GORIVO ORDER BY GorivoID ASC", konekcija))
    {
          DataTable dt = new DataTable();
          konekcija.Open();
          OleDbDataAdapter adapter = new OleDbDataAdapter(komPrikaz);
          adapter.Fill(dt);
          listBox1.Items.Clear();
          for (int i = 0; i < dt.Rows.Count; i++)
          {
                string pom;
                pom = dt.Rows[i][0].ToString() + " " + dt.Rows[i][1].ToString() + " " + dt.Rows[i][2];
                listBox1.Items.Add(pom);
          }
     }
}

答案 1 :(得分:1)

Clear您的DataTable再次填写之前。

void fill_List()
{
    konekcija.Open();
    OleDbCommand komPrikaz = new OleDbCommand("SELECT * FROM GORIVO ORDER BY GorivoID ASC", konekcija);
    adapter.SelectCommand = komPrikaz;
    dt.Clear(); // clear here
    adapter.Fill(dt);
    listBox1.Items.Clear();
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        string pom;
        pom = dt.Rows[i][0].ToString() + " " + dt.Rows[i][1].ToString() + " " + dt.Rows[i][2];
        listBox1.Items.Add(pom);
    }
    konekcija.Close();
}