2009-03-17 64 views
3

私は現在でテストしてい:は、Delphi ClientDataSetの読み取り専用

  1. IBデータベースの方に指しているのSQLConnectionを。
  2. SQLConnectionフィールドに上記の値が設定されているSQLDataSetです。
  3. Datasetフィールド値として(2)にSQLDatasetを持つDatasetProvider。
  4. ClientDataSet(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プロパティから設定されているようです。あなたが説明した設定では、単にDataSetProviderからデータを取得するClientDataSet.Openを呼び出すことができます。

BTWでは、ClientDataSet.ApplyUpdatesメソッドを呼び出すときのDataSetProviderの既定の動作は、データが取得されたDataSet(均質クエリの場合)ではなく、接続オブジェクトにSQLクエリを送信することです。 DataSetProvider.ResolveToDataSetプロパティがtrueに設定されていないことを確認します。

最後に、関連していないメモでは、上記のコードはSQLインジェクション攻撃に対して開いているように見えます(これはテストしていませんが)。パラメータを使用してWHERE句を定義する方が安全です。誰かがEdit1に次のような情報を入力した場合、問題が発生する可能性があります(InterBaseでドロップテーブルの構文が使用されていると仮定します)。

+0

+1すばらしい答えがありますので、ここでお会いできてうれしいです。あなたがSOに貢献することは素晴らしいことでしょう! – Argalatyr

関連する問題