2009-03-17 8 views
3

나는 현재와 테스트입니다 : IB를 데이터베이스으로 지적되고델파이 ClientDataset의 읽기 전용

  1. 경우 SQLConnection.
  2. SQLConnection 필드가 위의 값으로 설정된 SQLDataset입니다.
  3. 데이터 집합 필드 값으로 (2)에 SQLDataset이있는 DatasetProvider입니다.
  4. (3)에서 공급자를 가리키는 ProviderName 필드가있는 ClientDataset.

나는 ... 하나 개의 레코드 DBGrid를 채 웁니다

function TForm1.GetCurrEmployee(const IEmployeeID: integer): OleVariant; 
const 
    SQLSELEMP = 'SELECT E.* FROM EMPLOYEE E WHERE E.EMPLOYEEID = %s'; 
begin 
    MainDM.SQLDataset1.CommandText := Format(SQLSELEMP, [Edit1.Text]); 
    Result := MainDM.DataSetProvider1.Data; 
end; 

데이터를 얻기 위해 (알리 스터 크리스티에서 차용) 다음과 같은 방법을 사용합니다. 내가 수동으로 레코드를 편집 할 때 그러나 포스트에 클릭 한 다음 메시지와 함께,

MainDM.ClientDataset1.ApplyUpdates(0); // <<<<<< 

이 폭탄을 사용하여 변경 사항을 적용하려고 "SQLDataset1 : 읽기 전용 데이터 집합을 수정할 수 없습니다."

공급자 및 ClientDataset의 ReadOnly 속성을 검사했으며 SQL에 조인이 없습니다.

무엇이 오류의 원인 일 수 있습니까?

+0

어떻게 ClientDataSet을 열 수 있습니까? GetCurrEmployee 메서드는 SQLDataSet만을 사용합니다. – mjn

+0

mjustin에 대한 응답으로 DataSetProvider의 Data 속성이 ClientDataSet에 할당되면 ClientDataSet이 활성화됩니다 (Data 속성에 포함 된 모든 데이터에 메타 데이터가 추가됩니다). 활성 ClientDataSet이 열려 있습니다. –

답변

0

TIBDataSetLiveMode 속성을 확인하십시오.

4

ClientDataSet.Data 속성이 DataSetProvider의 Data 속성에서 채워진 것처럼 보입니다. 위에서 설명한 설정을 사용하면 ClientDataSet.Open을 호출하여 DataSetProvider에서 데이터를 가져올 수 있습니다.

BTW, ClientDataSet.ApplyUpdates 메서드를 호출 할 때 DataSetProvider의 기본 동작은 데이터를 가져온 DataSet이 아니라 연결 개체에 SQL 쿼리를 보내는 것입니다 (균질 쿼리라고 가정). DataSetProvider.ResolveToDataSet 속성이 true로 설정되어 있지 않은지 확인하십시오.

마지막으로 관련없는 메모에서 위의 코드는 SQL 주입 공격에 대해 열려있는 것처럼 보입니다 (아직 테스트하지는 않았지만). 매개 변수를 사용하여 WHERE 절을 정의하는 것이 더 안전합니다. 누군가가 Edit1에 다음을 입력하면 문제가 생길 수 있습니다 (InterBase가 드롭 테이블 구문을 사용한다고 가정). 1; drop table employee;

+0

+1 좋은 답변을드립니다. 여기에서 만나서 기쁩니다. SO에 당신이 공헌하게하는 것이 환상적입니다! – Argalatyr