3

私は現在以下でテストしています:

  1. IB データベースを指す SQLConnection。
  2. 上記のものに設定された SQLConnection フィールドを持つ SQLDataset。
  3. (2) の SQLDataset を Dataset フィールド値として持つ DatasetProvider。
  4. (3) のプロバイダーを指す ProviderName フィールドを持つ ClientDataset。

次の方法 (Alister Christie から借用) を使用してデータを取得します...

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;

これにより、DBGrid に 1 つのレコードだけが入力されます。ただし、レコードを手動で編集する場合は、[投稿] をクリックし、次を使用して変更をコミットしてみてください。

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

「SQLDataset1: 読み取り専用データセットを変更できません」というメッセージが表示されます。

Provider と ClientDataset の ReadOnly プロパティを確認しましたが、SQL に結合がありません。

エラーの原因は何ですか?

4

2 に答える 2

5

ClientDataSet.Data プロパティは、DataSetProvider の Data プロパティから取り込まれているようです。説明したセットアップでは、DataSetProvider からデータを取得する ClientDataSet.Open を呼び出すだけで済みます。

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

最後に、無関係なメモとして、上記のコードは SQL インジェクション攻撃を受けやすいようです (私はこれをテストしていませんが)。パラメータを使用して WHERE 句を定義する方が安全です。誰かが Edit1 に次のように入力すると、問題が発生する可能性があります (InterBase がドロップ テーブル構文を使用していると仮定します): 1;drop table employee;

于 2009-07-10T20:19:11.413 に答える
0

LiveModeのプロパティを確認してくださいTIBDataSet

于 2009-06-10T02:17:20.950 に答える