2013-03-01 3 views
0

SQLPort 데이터베이스를 사용하여 작업하고 나중에 직렬 포트를 통해 장치로 정보를 보내고받는 프로젝트에 연결됩니다. 이 데이터베이스는 통신의 모든 부분에 대한 정보를 저장합니다. 데이터 집합을 업데이트하고이 업데이트 된 데이터를 데이터베이스에 커밋하는 데 조금 어려움이 있습니다.SQL CE 및 데이터 집합 - 행이 없습니다.

data = new DataSet(); 
adapter = new SqlCeDataAdapter("SELECT * FROM " + [table_name]) 
builder = new SqlCeCommandBuilder(adapter); 
adapter.Fill(data, [table_name]); 

data.Tables[table_name].Rows[identity_value][a_column] = a_column_value; 
adapter.Update(data, [table_name]); 

나는 ID 값 1에서 테이블의 레코드를 가지고 내가 보장하고있어이 방법을 실행하기 전에 나는 adapter.Update를 호출하기 전에 그러나 나는 There is no row at position 1 IndexOutOfRangeException을 얻고있다(). 데이터 집합을 사용하고 업데이트하는 방법을 잘못 이해했다고 가정합니다. 어떤 충고?

행을 업데이트하기 전에 Dataset을 살펴 보았지만 디버거가 Dataset을 피어날 수는없는 것 같습니다. 이렇게하는 방법이 있습니까? 이

+0

) (builder.GetDeleteComm를 데이터 집합은) 당신이 builder.GetInsertCommand을 (를 호출해야합니다 생각의 SQL Server Compact – ErikEJ

+0

에 액세스 할 수있는 가장 성능이 좋은 방법이 아니다 사용 builder.GetUpdateCommand 및()를 사용하여 데이터 어댑터를 업데이트하십시오. – Derek

+0

그러나 내 디자인 결정이 아니었지만 무엇을 권하고 싶습니까? –

답변

0

시도 : 당신이 잘못 Rows

data.Tables[table_name].Rows[ROWINDEX][COLUMNINDEX] 

rowIndex에 배열 인덱스가 아닌 정체성 인 속성을 해석하는

var rows = data.Tables[table_name].Select(String.Format("[Id] = {0}",identity_value)); 

if (rows.Length == 1) 
{ 
    rows[0][a_column] = a_column_value; 
} 

제안 :

당신이있는 경우 DataSet 다음로드 테이블 스키마를 사용하려면 SqlCeDataAdapter.FillSchema와 너무 정보 :

adapter.FillSchema(data.Tables[table_name], SchemaType.Mapped); 

adapter.Fill(data, [table_name]);이 부하 데이터 만 :

: 당신이 적어도 하나 개의 컬럼 DataTable 당신이 DataRowCollection.Find Method으로 행을 얻을 수있는 기본 키 컬럼으로 지정된 경우 다음

DataRow foundRow = data.Tables[table_name].Rows.Find(identity_value); 
+0

해결책을 제공해 주셔서 감사합니다. (작동합니다!) 내 문제를 설명 할 수 있는지 궁금합니다. 시도했다? –

+0

@SimonJohnson이 대답에 추가되었습니다. – giammin

+0

그래서 (행의 ID 필드로) 데이터 집합 내부에서 행을 직접 가져 와서 일부 데이터를 수정하는 (우아한) 방법이 없습니까? –