この記事は、『基礎からのASP.NET』
目時秀典・鈴木和久 著/ソフトバンククリエイティブ
を教科書にして、C#で勉強していこうというものです。(全32+2チャプター)
当ブログのASP.NET &C#カテゴリにある、
(*)ASP.NET &C# カテゴリ記事の注意点
を必ず一度はお読みになってくださいね。
今回はチャプター20に相当します。
(23)で作ったデータベースを新しいWebページに追加してある前提で進めます。
とりあえず、GridViewコントロールだけページに配置したら、
今度はSqlDataSourceをGridViewのタスクメニューから作ってみましょう
(デザイン画面のグリッドビューコントロールを選択した状態で
コントロールの右上にある[>]ボタンを押します)
データソースとして「データベース」を選択すること以外は
以前やったSqlDataSourceコントロールのタスクメニューと
同じ手順です。
Selectステートメントの構成ダイアログで、
WHERE句を設定する代わりに、その下にある詳細設定ボタンを押すと
図のようなオプションが設定できます。
さらに設定完了後、GridViewのタスクメニューに追加されている
「編集を有効にする」、「削除を有効にする」をチェックすると
グリッドビューの一番左にリンクが生成されます。
このフィールドは「CommandField」というらしく、
タスクメニューの「列の編集」で表示されるウィンドウから
プロパティの操作ができます。
「ButtonType」プロパティをButtonにすると、リンクでなくボタン表示にもできます。
先に進む前にとりあえず「編集」と「削除」のテストをしようと思ったところ・・・
'/Chapter20' アプリケーションでサーバー エラーが発生しました。
使用されている SQL Server のバージョンでは、データ型 'date' がサポートされていません。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。
などというエラーが発生してしまいました。
???本の通りにやってるだけなんですが、環境が違うせいなのかなんなのか?
とりあえず、プロジェクト内のドキュメントからdateというキーワードを検索して、
それらしきところを探してみました。
Edit.aspxでそれっぽい箇所を発見・・・。
<asp:SqlDataSource ~></asp:SqlDataSource>
タグの中で、
<UpdateParameters>
<asp:Parameter Name="Item" Type="String" />
<asp:Parameter Name="Priority" Type="String" />
<asp:Parameter Name="StatusID" Type="Int32" />
<asp:Parameter Name="TypeID" Type="Int32" />
<asp:Parameter DbType="Date" Name="StartDate" />
<asp:Parameter DbType="Date" Name="EndDate" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="ID" Type="Int32" />
</UpdateParameters>
とあります。
ここで、DbType="Date"とあるのが、どうやらお気に召さないらしい。
VWD2008は、テーブル項目の属性を知っているはずで、
まぁ知ってるから「Date」としたはずなのに、なぜ怒られる・・・
(ついでに言えばバージョンだって知らないはずないんじゃ?)
バグ??
自動生成されたところをあれこれいじってしまうと、わけが分からなくなることが
多いので、検証用に別の新しいWebサイトを作り、さらに
もっとシンプルなテーブルを作って試したところあっさり再現しました・・・。
VWD2008のバージョン-------------
Microsoft Visual Studio 2008
Version 9.0.30729.1 SP
Microsoft .NET Framework
Version 3.5 SP1
----------------------
SQL Server2005で取得できるバージョン情報-------------
Microsoft SQL Server Management Studio Express 9.00.2047.00
Microsoft Data Access Components (MDAC) 2000.085.1132.00 (xpsp.080413-0852)
Microsoft MSXML 2.6 3.0 4.0 5.0 6.0
Microsoft Internet Explorer 8.0.6001.18702
Microsoft .NET Framework 2.0.50727.3082
オペレーティング システム 5.1.2600
----------------------
列のデータ型を「smalldatetime」で設定したのがまずかったのかと思い、
「datetime」にしても結果は同じ。
他の項目にしても、テーブルを作る時には「String」や「Int32」などは
使っていないため、ASP.NET流に型指定しなきゃいけないらしいのだが・・・。
ん、よくみると.NET Frameworkのバージョンが3.5と2.0って差がありますね。
関係あるのかなぁ・・・?
ググってもなかなか有効そうな情報がみつからなかったけど、
DbType="DateTime" と記述されたコードを発見。
DbType="Date"じゃなくて"DateTime"を試してみたところ、うまくいきました^^v。
なんだかなぁ・・・。
"DateTime"を指定してあると、
「datetime」でも「smalldatetime」でも更新が可能でした。
とゆわけで、<UpdateParameters>タグだけじゃなく、
<InsertParameters>の中の記述も修正・・・。
整理すると、
Microsoft Visual Web Developer 2008 Express Editionで、
GridViewコントロールのタスクメニューで自動生成された、
<UpdateParameters>、<InsertParameters>タグ内の
<Parameter>タグの、DbType属性には問題がある(ことがある?)ようです。
まぁ無料版なのであまりつっこまないでおきますか・・・時間とられたorz
さて、今回はやりたいことがもう一つあります。
StatusID、TypeID は、レコードを更新する場合に素の数字よりは
ドロップダウンリストから選択とかしたいですよね?
本にはばっちりやり方が載っていました。
GridViewのタスクメニューで、「新しい列の追加」を選択します。
フィールドの追加というウインドウが開くので、
フィールド型を「TemplateField」に設定します。
ヘッダーテキストは適当でよいですが「状態」としておきます。
で、OKを押すとフィールドが追加されます。
もう一度GridViewのタスクメニューで今度は「テンプレートの編集」を
選択します。
(「テンプレート編集の終了」を選択すると元の表示に戻れます)
表示されたItemTemplateに、DropDownListをドロップし、
そのタスクメニュー「DataBindingsの編集」で図のように設定します。
また、以前やったように、ドロップダウンリストにデータソースを結びつけ、
Statusテーブルの内容が、表示されるように設定します。
これはDropDownListのタスクメニュー「データソースの選択」から行います。
(<新しいデータソース>を選択します)
どうでしょうか?
動きましたか?
ついでに、もう一つ同じ手順でTypeテーブルからデータを持ってきて
「分類」フィールドも作ってみましょう。
このとき、データソースの名前をSqlDataSource1にしてしまうと
重複でエラーになってしまうので、SqlDataSource2とでもして置きます。
う?「DataBindingsの編集」でカスタムバインドしか選べない・・・
ここも微妙に本と違ったけど、コード式の部分を先ほどのフィールドの
マネをしてBind("TypeID", "{0}") と埋めたらちゃんと動きました!
うーむ、駆け足で本の通りやっただけだとちゃんと理解してるか
怪しいけど、まぁこんなこともできますってことで・・・
忘れたら図もとってあるから思い出せるでしょう^^;
最終的にはこんな感じです。
今回はここまでにしておきます。
「編集」「削除」ができるようになったので次回は「追加」です。
次もコード記述をしないでGUIだけでできてしまうようです。
でも自動でできるコードが間違ってるのはやっぱ勘弁してほしいなぁ~><

(1)
この記事にコメントする