2017-12-03 16 views
0

다음 코드는 예외를 throw하지 않지만 SQLite 데이터베이스를 업데이트하지 않습니다. 두 가지 방법이 있습니다. 하나는 Update 버튼에 의해 호출되고 GridView에서 업데이트 된 데이터를 가져옵니다. SQLite 파일을 제어하고 씁니다. 실제로 데이터베이스를 업데이트하지도 않습니다. 업데이트 방법에는 여러 가지 기법을 사용하여 데이터 쓰기를 시도하는 몇 가지 시도가 있습니다. 컨텍스트에 모든 것을 포함 시켰으며 기능이 코드의 다른 부분으로 나뉘어져 있습니다. Metro Framework를 사용하고 있지만 데이터베이스 코드와 다를 바는 없다고 생각합니다.VS2017 SQLite가 데이터베이스에 데이터를 쓰지 않습니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

using MetroFramework.Forms; 
using MetroFramework; 

using System.Data.SQLite; 


namespace MetroTestApp 
{ 
    public partial class Form1 : MetroFramework.Forms.MetroForm 
    { 
     static List<String> entries = new List<string>(); 
     private BindingSource masterBindingSource = new BindingSource(); 
     private BindingSource detailsBindingSource = new BindingSource(); 
     DataSet data = new DataSet(); 

     static string DbConnectionString = @"Data Source=Emp.db;Version=3;"; 
     static SQLiteConnection dbc = new SQLiteConnection(DbConnectionString); 

     public SQLiteDataAdapter departmentDataAdapter; 
     SQLiteDataAdapter empDataAdapter; 

     DataRelation relation; 
     SQLiteCommandBuilder cmdBuilder = new SQLiteCommandBuilder(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void metroTile1_Click(object sender, EventArgs e) 
     { 
      MetroFramework.MetroMessageBox.Show(this, "OK", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 

     private void metroTile2_Click(object sender, EventArgs e) 
     { 
      MetroFramework.MetroMessageBox.Show(this, "Stop", "Message", MessageBoxButtons.OKCancel, MessageBoxIcon.Stop); 
     } 

     private void metroGrid2_CellContentClick(object sender, EventArgs e) { } 

     private void metroButton2_Click(object sender, EventArgs e) { } 

     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      dbc.Close(); 
      cmdBuilder.Dispose(); 
      departmentDataAdapter.Dispose(); 
      empDataAdapter.Dispose(); 
      masterBindingSource.Dispose(); 
      empDataAdapter.Dispose(); 
      data.Dispose(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     // string DbConnectionString = @"Data Source=Emp.db;Version=3;"; 
     // using (SQLiteConnection dbc = new SQLiteConnection(DbConnectionString)) 
       try 
       { 
        dbc.Open(); 

        departmentDataAdapter = new SQLiteDataAdapter("select * from DEPARTMENT", dbc); 
        empDataAdapter = new SQLiteDataAdapter("select * from EMP", dbc); 

        departmentDataAdapter.Fill(data, "DEPARTMENT"); 
        empDataAdapter.Fill(data, "EMP"); 

        DataRelation relation = new DataRelation("EMPDPEP", data.Tables["DEPARTMENT"].Columns["DEPNO"], data.Tables["EMP"].Columns["DEPNO"]); 
        data.Relations.Add(relation); 

        masterBindingSource.DataSource = data; 
        masterBindingSource.DataMember = "DEPARTMENT"; 
        detailsBindingSource.DataSource = masterBindingSource; 
        detailsBindingSource.DataMember = "EMPDPEP"; 

        DEPGridView.DataSource = masterBindingSource; 
        EMPGridView.DataSource = detailsBindingSource; 

        DEPGridView.AutoResizeColumns(); 
        EMPGridView.AutoResizeColumns(); 
       } 
       catch (SQLiteException ex) 
       { 
        MetroFramework.MetroMessageBox.Show(this, "Stop", ex.Message.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Stop); 
       } 
     } 

     private void metroButton3_Click(object sender, EventArgs e) 
     { 
      //dbc.Open(); 

      //departmentDataAdapter = new SQLiteDataAdapter("select * from DEPARTMENT", dbc); 
      //empDataAdapter = new SQLiteDataAdapter("select * from EMP", dbc); 


      SQLiteCommandBuilder cb=new SQLiteCommandBuilder(empDataAdapter); 
      empDataAdapter.DeleteCommand = cb.GetDeleteCommand(true); 
      empDataAdapter.UpdateCommand = cb.GetUpdateCommand(true); 
      empDataAdapter.InsertCommand = cb.GetInsertCommand(true); 

      SQLiteCommandBuilder cb1 = new SQLiteCommandBuilder(departmentDataAdapter); 
      departmentDataAdapter.DeleteCommand = cb1.GetDeleteCommand(true); 
      departmentDataAdapter.UpdateCommand = cb1.GetUpdateCommand(true); 
      departmentDataAdapter.InsertCommand = cb1.GetInsertCommand(true); 

      // MetroFramework.MetroMessageBox.Show(this, cb.GetUpdateCommand().ToString(), "OK", MessageBoxButtons.OK, MessageBoxIcon.Information); 

      empDataAdapter.AcceptChangesDuringUpdate = true; 
      departmentDataAdapter.AcceptChangesDuringUpdate = true; 

      DataTable dt = new DataTable(); 
      empDataAdapter.Fill(dt); 
      empDataAdapter.Update(dt); 

      data.AcceptChanges(); 

      empDataAdapter.Update(data, "EMP"); 
      departmentDataAdapter.Update(data, "DEPARTMENT"); 
      empDataAdapter.Update(data.Tables["EMP"]); 
      departmentDataAdapter.Update(data.Tables["DEPARTMENT"]); 


      dt.Dispose(); 
      cb.Dispose(); 
      cb1.Dispose(); 
      dbc.Close(); 

     } 

     private void metroButton4_Click(object sender, EventArgs e) 
     { 
      dbc.Open(); 
      DataTable t; t = data.Tables["DEPARTMENT"]; 
      DataRow newRow; 
      newRow = t.NewRow(); 

      newRow["DEPNO"] = 10; newRow["DEPNAME"] = "GAMES"; 

      t.Rows.Add(newRow); 
      data.AcceptChanges(); 
      DEPGridView.Refresh(); 
      dbc.Close(); 
      t.Dispose(); 

     } 
    } 
} 

답변

1

코드

 DataTable dt = new DataTable(); 
     empDataAdapter.Fill(dt); 
     empDataAdapter.Update(dt); 

당신은 데이터를 얻고 직접 다시 데이터베이스를 작성하고이 부분보고하십시오. 아무 것도 변경하지 않으면 db에 변경 사항이 표시되지 않습니다. 나는 변경되지 같이 동의 변화가 모든 레코드를 표시 다음은 코드가이

 data.AcceptChanges(); 

     empDataAdapter.Update(data, "EMP"); 
     departmentDataAdapter.Update(data, "DEPARTMENT"); 
     empDataAdapter.Update(data.Tables["EMP"]); 
     departmentDataAdapter.Update(data.Tables["DEPARTMENT"]); 

와 다음이 코드

의 지점을 표시하지 않습니다. 따라서 DataAdapter.Update는 데이터베이스에 보낼 변경된 레코드를 보지 않습니다. DataAdapter.Updates 뒤에이 코드 줄을 옮기고 레코드를 다시 업데이트 해 봅니다.

empDataAdapter.Update(data, "EMP"); 
    departmentDataAdapter.Update(data, "DEPARTMENT"); 
    empDataAdapter.Update(data.Tables["EMP"]); 
    departmentDataAdapter.Update(data.Tables["DEPARTMENT"]); 

    data.AcceptChanges(); 
+0

고맙습니다. 문제가 해결되었습니다. 여러분이 말한 것처럼, 레코드가 변경된 후에 Update()를 실행해야합니다. 그리고 이렇게 많은 코드를 작성해 주셔서 감사합니다. –