2016-04-15 8 views
0

私はWPIのVisual C#でSQLIteデータベースにデータを挿入します。 insertコマンドは正常に動作します。結果の行の総数を返すことで関数をチェックし、行が挿入されていることを示します。しかし、すべてのデータをチェックすると、何も表示されません。また、私は、合計数を取得しようと、それはここでは0SQLiteの挿入行が自動的に削除される

を示して私のデータベースコントローラーのコードです:

class TableController 
{ 
    SQLiteConnection m_dbConnection; 

    public TableController() 
    { 
     SQLiteConnection.CreateFile("MyDatabase.sqlite"); 
     m_dbConnection = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;"); 
     createDb(); 

    } 

    public void createDb() 
    { 

     m_dbConnection.Open(); 
     string sql = "CREATE TABLE data (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), address VARCHAR(100), mobile VARCHAR(20), date VARCHAR(20), price VARCHAR(20), warranty VARCHAR(20), month VARCHAR(20))"; 
     SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); 
     command.ExecuteNonQuery(); 
     m_dbConnection.Close(); 
    } 

    public Boolean add_data(Objectdata od) 
    { 
      m_dbConnection.Open(); 
      string sql = "INSERT INTO data (name, address, mobile, date, price, warranty, month) values ('" + od.name + "', '" + od.address + "', '" + od.mobile + "', '" + od.date + "', '" + od.price + "', '" + od.warranty + "', '" + od.month + "')"; 
      SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); 
      int a = command.ExecuteNonQuery(); 
      m_dbConnection.Close(); 

      if (a == 0) 
      { 
       return false; 
      } 
      else if (a == 1) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 

    } 


    public List<Objectdata> getAllData() 
    { 

     m_dbConnection.Open(); 
     List<Objectdata> dataList = new List<Objectdata>(); 
     Objectdata oD = new Objectdata(); 

     string sql = "select * from data order by id"; 
     SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); 
     SQLiteDataReader reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      oD.setId(reader["id"].ToString()); 
      oD.setName(reader["name"].ToString()); 
      oD.setAddress(reader["address"].ToString()); 
      oD.setMobile(reader["mobile"].ToString()); 
      oD.setDate(reader["date"].ToString()); 
      oD.setPrice(reader["price"].ToString()); 
      oD.setWarranty(reader["warranty"].ToString()); 
      oD.setMonth(reader["month"].ToString()); 

      dataList.Add(oD); 

     } 
     m_dbConnection.Close(); 


     return dataList; 
    } 

    public Objectdata getSingleData(String id) 
    { 

     m_dbConnection.Open(); 

     Objectdata oD = new Objectdata(); 

     string sql = "select * from data WHERE id = '" + id + "'"; 
     SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); 
     SQLiteDataReader reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      oD.setId(reader["id"]); 
      oD.setName(reader["name"]); 
      oD.setAddress(reader["address"]); 
      oD.setDate(reader["date"]); 
      oD.setMobile(reader["mobile"]); 
      oD.setPrice(reader["price"]); 
      oD.setWarranty(reader["warranty"]); 

     } 
     m_dbConnection.Close(); 

     return oD; 

    } 

    public int getCount() 
    { 

     m_dbConnection.Open(); 

     int count = 0; 
     string sql = "SELECT * FROM data"; 
     SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); 
     SQLiteDataReader reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      count++; 
     } 
     m_dbConnection.Close(); 
     return count; 
    } 

そして私は、このクラスを介してデータにアクセスしています。

TableController tablecon = new TableController(); 

      Objectdata ob = new Objectdata(); 
      ob.name = name.Text.ToString(); 
      ob.address = address.Text.ToString(); 
      ob.mobile = mobile.Text.ToString(); 
      ob.date = date.Text.ToString(); 
      ob.price = price.Text.ToString(); 
      ob.warranty = warranty.Text.ToString(); 
      ob.month = mc.returnMonth(date.Text.ToString()); 
      Boolean res = tablecon.add_data(ob); 

      if (res) 
      { 
       MessageBox.Show("Added"); 
       name.Clear(); 
       name.Clear(); 
       address.Clear(); 
       mobile.Clear(); 
       price.Clear(); 
       warranty.Clear(); 
      } 
      else 
      { 
       MessageBox.Show("Sorry an error occurred!"); 
      } 

     private void button_refresh_Click(object sender, RoutedEventArgs e) 
    { 
     TableController a = new TableController(); 
     dataList = a.getAllData(); 
     listView.ItemsSource = dataList; 
    } 

とクラスの1カウント(それがゼロを示している)を確認します

public void getId(String id) 
    { 
     this.id = id; 
     load_data(id); 
    } 

    public void load_data(String id) 
    { 
     Objectdata o = new Objectdata(); 
     o = tableContoller.getSingleData(id); 
     name.AppendText(tableContoller.getCount().ToString()); 
     address.AppendText(o.getAddress()); 
     mobile.AppendText(o.getMobile()); 
     date.AppendText(o.getDate()); 
     price.AppendText(o.getPrice()); 
     warranty.AppendText(o.getWarranty()); 
    } 
+0

あなたのコンストラクタで接続を作成するので、かなり確かです。あなたは、接続を作成し、接続を開き、何でもしてから、すぐに接続を終了する必要があります。また、 'use'ブロックで接続とコマンドをラップして、接続を適切に処理できるようにする必要があります。 – Icemanind

+0

だから、m_dbConnection =新しいSQLiteConnection( "データソース= MyDatabase.sqlite;バージョン= 3;";個々の機能で? –

答えて

1

を、実際に例外をスローする必要がありますどのテーブルdataを再作成しようとしています原因あなたのCreateDB()方法が混乱して。どのような方法であれ、コンストラクタからそのメソッド呼び出しを削除してください。あなたのコンストラクタを参照してください...

+0

それで、そのテーブルが存在すると、そのコマンドは古いテーブルを破壊して新しいテーブルを作成しますか?これを行うには、CREATE TABLEコマンドでかなり奇妙に思えます。確かに私は他のデータベースでこの動作を見ていません。 – Steve

+0

@スティーブ、そうですね、そうではありませんが、彼のコードに従って...それはエラーも投げます。コードが最初に実行されるべきではないということです。 – Rahul

+0

これをどのようにしたらいいですか?私はあまりよく分かっていませんが、以前はうまくいっていました。私は以前のコードを紛失していて、どうやってそれをやったのか覚えていない。たぶん、テーブルを作成して照合してからクエリを実行するようにしてください。 –

関連する問題