2009-06-18 2 views
0

데이터 세트에 바인딩 된 Xceed 's Datagrid를 사용하고 있습니다. DataGrid의 RowEditEnd가 호출 될 때 데이터베이스를 업데이트하려고합니다. 문제는 업데이트 할 때 동시성 위반을 피하기 위해, 나는 다음과 같이 업데이트 후 데이터 집합을 취소하고 그것을 보충해야한다는 것입니다 : 나는 이렇게 생각그리드의 바운드 데이터 세트에서 데이터베이스를 업데이트 할 때 내 DataGrid의 선택이 손실됩니다. 해결 방법은 무엇입니까?

public void UpdateDatabaseFromDataSet() 
{ 
    adapter.Update(exampleDataSet); 
    exampleDataSet.Clear(); 
    adapter.Fill(exampleDataSet); 
} 

을 내 데이터 세트의 기본 자동 증가 열 "ID 때문에 "데이터베이스에서 생성 된 값과 일치하지 않습니다. 데이터 집합을 지울 때 DataGrid 및 선택한 셀을 지 웁니다. 셀을 편집하고 Enter 키나 방향키를 누르면 셀과 데이터베이스가 잘 업데이트되지만 다음 행/셀로 이동하지 않고 선택 항목이 재설정되므로 매우 불편할 수 있습니다. 이것은 손으로 데이터를 입력하는 것을 매우 번거롭게 만듭니다. 나는 -1에 autoincrementseed 테이블과 autoincrementsteps 설정을 시도했지만 나는 데이터 집합을 보충하지 않으면 난 아직도 동시성 위반을 얻을

public void InitDataSet(int tableid) 
{ 
    cmd = new SQLiteCommand("SELECT * FROM table_" + tableid, con); 
    adapter = new SQLiteDataAdapter(cmd); 
    cb = new SQLiteCommandBuilder(adapter); 

    try 
    { 

     exampleDataSet = new DataSet(); 

     adapter.Fill(exampleDataSet); 
     prodDataSet.Tables[0].Columns[0].AutoIncrementSeed = -1; 
     prodDataSet.Tables[0].Columns[0].AutoIncrementStep = -1; 

     currenttableID = tableid; 
    } 
    catch (ApplicationException ex) 
    { 
     MessageBox.Show("Encountered an error.", "Error: " + ex.ToString()); 
    } 
} 

참고 : 여기에

는 데이터 세트를 생성하는 방법이다.

데이터 세트를 지우지 않고 다시 채우지 않으면 데이터 그리드가 작동하는 것이 좋습니다. 어쨌든 실행중인 동시성 위반을 피할 수 있습니까? 내가 잘못된 방향으로가는거야?

도움 주셔서 감사합니다. -Steven

답변

1

내가 정확히 전체 문제를 이해하지 않습니다하지만 난 당신에게 뭔가를 줄 수있을
당신이 명확하지 데이터 집합을 수행하고 "병합"하기 위해 노력할 것이다 "채우기"전화 때 기존 레코드가있는 DB의 레코드 분명히 당신의 그리드가 새로 고쳐 지도록 강요합니다. 선택된 행을 잃어 버렸습니다.


Adapter.FillLoadOption = LoadOption.PreserveChanges (또는 기타);
변경된 db의 레코드가 데이터 세트와 병합되는 방식에 영향을 줄 수 있습니다.


이제 남은 한 가지 문제가 있고 그 삽입이 일어난 새로운 자동 증가 (Autoinc) 값을 결정하는 것입니다. 당신은 그래서

void Adapter_RowUpdated(object sender, SqlRowUpdatedEventArgs e) 
     { 
      if (e.StatementType==StatementType.Insert) 
      { 

       Select last autoinc value with @@Identity 
       e.Row["ID"] = last autoinc value 
      } 
     } 

을 Adapter.RowUpdated 잡을 수 있습니다 : 데이터 테이블

  • 캐치 rowupdated 드

    • 이 명확하지 않고 새로운 넣어 그것을에서 DB의 최신 자동 증가 (Autoinc) 값을 얻을 행
    • Evt. 다른 사용자가 변경 한 사항을 확인하려면 fill을 호출하십시오.
  • +0

    그래, 나는 매우 명확하지 않은 질문에 대해 사과드립니다. 그들이 내 문제를 해결할 수있는 것처럼 당신의 제안을 주셔서 대단히 감사합니다. 나는 다음 주에 집에 돌아와서 제안했던 것을 시도해보고 어떻게되었는지 알려줄 것입니다. 다시 한 번 감사드립니다. – stevosaurus

    +0

    당신이 올바른 방향으로 나를 지적한 이후로 당신의 대답을 받아 들였습니다. Julian에게 많은 도움을 주셔서 감사합니다. 아래의 다른 답변에서 사용 된 실제 코드를 게시했습니다. 다시 한 번 감사드립니다! – stevosaurus

    0

    다음은 다른 사람들을 위해 여기에 넣은 코드입니다.

    가 여기 내 데이터 공급자의 업데이트 방법 (I 여분 채우기 호출을 제거 할 수 있었다주의)이다 :

    public void UpdateDatabaseFromDataSet() 
    { 
        adapter.Update(exampleDataSet); 
    } 
    

    그리고 여기 내가 사용하고있어 RowUpdated 이벤트입니다 :

    void adapter_RowUpdated(object sender, System.Data.Common.RowUpdatedEventArgs e) 
    { 
        if (e.StatementType == StatementType.Insert) 
        { 
         SQLiteCommand cmdNewID = new SQLiteCommand("SELECT last_insert_rowid()", con); 
         e.Row["RowID"] = cmdNewID.ExecuteScalar(); 
        } 
    }