2017-02-15 13 views
0

Когда я пытаюсь просмотреть данные базы данных после обновления или удаления данных, программа показывает мне эти данные несколько раз. Я не знаю, он не любит обновление или что? я не могу найти проблему, она скрыта где-то в выходной функции?Данные из базы данных отображаются несколько раз

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add(new DataColumn("ID", typeof(int))); 
      dt.Columns.Add(new DataColumn("Vards", typeof(string))); 
      dt.Columns.Add(new DataColumn("Uzvards", typeof(string))); 

      string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=dbs.accdb"; 
      OleDbConnection con = new OleDbConnection(ConnectionString); 
      int izvele; 
      do 
      { 
       Console.WriteLine("1 - Apskatīt tabulas datus"); 
       Console.WriteLine("2 - Labot tabulas datus"); 
       Console.WriteLine("3 - Dzēst tabulas datus"); 
       izvele = int.Parse(Console.ReadLine()); 
       switch (izvele) 
       { 
        case 1: 
         OleDbCommand cmd = new OleDbCommand("SELECT * FROM PERSONA", con); 
         con.Open(); 
         OleDbDataReader dataReader = cmd.ExecuteReader(); 
         while (dataReader.Read()) 
         { 
          DataRow dr = dt.NewRow(); 
          dr["ID"] = dataReader["ID"]; 
          dr["Vards"] = dataReader["Vards"]; 
          dr["Uzvards"] = dataReader["Uzvards"]; 
          dt.Rows.Add(dr); 
         } 
         con.Close(); 
         dt.AcceptChanges(); 
         PrintDataTable(dt); 
         break; 
        case 2: 
         OleDbCommand upCmd = new OleDbCommand("UPDATE PERSONA SET Vards =?, Uzvards =? WHERE ID =? ", con); 


         Console.Write("Ievadiet jauno vārdu: "); 
         string jaunaisVards = Console.ReadLine(); 
         upCmd.Parameters.Add(new OleDbParameter("@Vards", jaunaisVards)); 
         Console.Write("Ievadiet jauno uzvārdu: "); 
         string jaunaisUzvards = Console.ReadLine(); 
         upCmd.Parameters.Add(new OleDbParameter("@Uzvards", jaunaisUzvards)); 

         Console.Write("Kuru lauku vēlaties labot? "); 
         int lauksID2 = int.Parse(Console.ReadLine()); 
         upCmd.Parameters.Add(new OleDbParameter("@ID", lauksID2)); 
         Console.Write("Vai tiešām vēlaties dzēst šo ierakstu?"); 
         string atbilde2 = Console.ReadLine(); 

         if (atbilde2 == "y") 
         { 
          con.Open(); 
          upCmd.ExecuteNonQuery(); 
          con.Close(); 

         } 
         else if (atbilde2 == "n") 
         { 
          Console.WriteLine("Ieraksts netika labots"); 
          break; 
         } 



         break; 

        case 3: 
         OleDbCommand dCmd = new OleDbCommand("DELETE FROM PERSONA WHERE ID=?", con); 

         Console.Write("Kuru lauku vēlaties dzēst? "); 
         int lauksID = int.Parse(Console.ReadLine()); 
         dCmd.Parameters.Add(new OleDbParameter("@ID", lauksID)); 

         Console.Write("Vai tiešām vēlaties dzēst šo ierakstu?"); 
         string atbilde = Console.ReadLine(); 
         if (atbilde == "y") 
         { 
          con.Open(); 
          dCmd.ExecuteNonQuery(); 
          con.Close(); 
         } 
         else if (atbilde == "n") 
         { 
          Console.WriteLine("Ieraksts netika dzēsts"); 
          break; 
         } 

         break; 

        default: 
         break; 
       } 

      } while (izvele != 0); 


     } 
     static void PrintDataTable(DataTable dt) 
     { 
      foreach (DataColumn dc in dt.Columns) 
      { 
       Console.Write(dc.ColumnName + "\t"); 
      } 
      Console.WriteLine(); 
      Console.WriteLine(); 
      foreach (DataRow dr in dt.Rows) 
      { 
       for (int i = 0; i < dr.ItemArray.Length; i++) 
       { 
        Console.Write(dr[i] + "\t"); 
       } 
       Console.WriteLine(); 
      } 
     } 
    } 

} 

Im работает с базой данных Access и консольным приложением C#. Если есть текст, который вам нужно понять, тогда задайте

+0

Только для стиля, я бы разбивку ваш код так, что каждый случай требует отдельной функции, вместо того, чтобы иметь много кода в одной и той же функции. – frenchie

+0

Хорошо, помните об этом. –

ответ

1

Причина в том, что вы добавляете строки к тому же DataTable снова и снова. Вам нужно очистить строки перед каждым оператором select. Используйте dt.Clear();

con.Open(); 
    OleDbDataReader dataReader = cmd.ExecuteReader(); 
    dt.Clear();//HERE 
    while (dataReader.Read()) 
    { 
     DataRow dr = dt.NewRow(); 
     dr["ID"] = dataReader["ID"]; 
     dr["Vards"] = dataReader["Vards"]; 
     dr["Uzvards"] = dataReader["Uzvards"]; 
     dt.Rows.Add(dr); 
    } 
+1

Ох, хорошо, теперь он работает правильно, Большое вам спасибо. –