次に、編集、追加、削除もできないので不調ですよね。そこで、Common DetailsView
Tasksより、編集、追加、削除ができるようにしていきます。Common DetailsView Tasksより、Edit Field
を選択します。Available Fields の Command Field に、
- Edit, Update, Cancel
- Delete
- New, Insert, Cancel
フィールドがあるので、これらを Add ボタンにより追加していきます。下図のようにSelected Fields
にそれらのフィールドが追加されていることを確認します。

ここで、実行してみると、次のように、
が追加されています。

編集ボタンを押すと、次のような編集画面が表示されます。

同様に新規作成をクリックすると、次のように挿入画面が表示されます。

しかし、実際に挿入、編集、削除を実行すると、次のようなエラーが発生します。
'/DetailsView' アプリケーションでサーバー エラーが発生しました。
Inserting is not supported by data source 'SqlDataSource1'
unless InsertCommand is specified.

これは、INSERT, UPDATE, DELETE のSQLコマンドがセットされていないためです。
そこで、Common DetailsView Tasksより、Configure Data
Sourceを選択します。Choose a connection では、先ほど選択したコネクションストリングを選択します。

次に、Congigure Data Source ダイアログで、Advanced Options ボタンを押します。

すると、Advanced SQL Generation Options が表示されますので、Generate Insert,
Update and Delete statements にチェックします。また、Optimistic にしたい場合には、Use
optimistic concurrency にもチェックします。

| 注意 |
| Use optimistic concurrency
にチェックすると、コンフリクトしたかどうかを検出するように Update, Delete
文を修正してくれます。このとき、データソースのConflictDetection
プロパティがCompareAllValuesとなり、WHERE句ですべての項目の完全一致条件を追加されます。1つ1つを比較しているので頻繁にUpdate,
Delete が発生する場合は性能的に問題が出る可能性がありそうです。 一方、Use
optimistic concurrency にチェックしないと、データソースのConflictDetection
プロパティがOverwriteChanges
(デフォルト)となり、コンフリクトが発生した場合に予期せぬ結果(別の人が修正したものを知らずに上書きしてしまうなど)が発生しますので、十分な注意が必要です。
いずれにしても、自動生成におまかせするのはいいのですが、どのようなものが自動生成されたのか、特にコネクションストリング、SQL文は確認すべきです。 |
| 注意 |
Northwind のデータベースのデータ型で、ntext, image
という古いデータ型を使用しています。そのままだと、次のようなエラーが出ます。
- Data types ntext and nvarchar are
incompatible in equal to operator.
- Data types image and varbinary are incompatible
in equal to operator.
この場合、Northwind のデータ型をntext→nvarchar,
image→varbinary(MAX)に修正してあげる必要があります。
Visual Studio の Server Explorer から Emploeyeesテーブルで
Open Table Definition でテーブルの定義を開き、Photo, Notes
のデータ型を次のように変更します。
この場合、もう一度、上記のAdvanced SQL Generation Options
で再生成してあげる必要があります。

|

このままだと、画像が大きすぎるので、小さくします。Common Tasks より、Edit Field を選択し、Fields
ダイアログを表示します。この中のSelected Fields より、Photo を選択し、右PaneのControlStyle→Height,
Width で画像サイズを指定します。

これにより、次のようになります。
