- PR -

GridView で更新でエラー

1
投稿者投稿内容
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-21 16:02
お世話になります。

GridView の更新ボタンを押すと下記のエラーが出ます。どう対処したらいいでしょうか?関係ないかもしれませんが、サンプルとしていくつか作っていたものを1つのプロジェクトにまとめています。SQLも移動して再度設定しているのでいいと思っているのですが....また、この更新の前の表示は、正しく動作しています。

「更新 コマンドが SqlDataSource 'SqlDataSource1' 上の値すべてを比較するように指定しましたが、oldValues に対して渡されたディレクトリは空です。更新 に対して有効なディレクトリを渡すか、またはモードを OverwriteChanges に変更してください」

VS2005 C# ASP.NET よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-05-22 01:25
うまくいってるものがあるならそれと比較してみては?
とりあえず、SqlDataSourceのConflictDetectionがCompareAllValuesのときに出てそうなエラーです。
できれば現象が再現する最小のやり方を示してください。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-22 13:42
お世話になります。

> うまくいってるものがあるならそれと比較してみては?
更新するとき、「データソースの構成」で「テーブルまたはビューから列...」ー「詳細設定」「SQL生成の詳細オプション」で「INSERT,UPDATEおよびDELETEステートメント...」にチェックを入れたものは動作しています。が「カスタムステートメントまたはストアドプロシージャを定義します」で下記のように書いたとき、クエリビルダから「クエリの実行」すると(Dateに日付を入れ、他にも文字を入れて試すと)変更されています。
しかし、GridView の編集ボタンからデータを入れ「更新」を押すとエラーになるようです。

UPDATE Holidays SET IsOff = @IsOff, WorkStartTime1 = @WorkStartTime1, WorkEndTime1 = @WorkEndTime1, WorkStartTime2 = @WorkStartTime2, WorkEndTime2 = @WorkEndTime2 WHERE (Date = @Date)
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-05-22 16:09
比較してみては?というのは
『「INSERT,UPDATEおよびDELETEステートメント...」にチェックを入れたもの』と
『「カスタムステートメントまたはストアドプロシージャを定義します」で下記のように書いたとき』
双方のaspxやcsファイルを比較してみては?という意味です。動作が違うんだから何か違うと思います。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-05-22 16:31
直接の回答ではありませんが、

引用:

SLさんの書き込み (2008-05-21 16:02) より:

どう対処したらいいでしょうか?



私だったら GridView.RowUpdating イベント をハンドルして、GridViewUpdateEventArgs オブジェクトのプロパティを確認します。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-23 09:26
お世話になります。

> 比較してみては?というのは
UpdateCommand の後に、この文章がありConflictDetection="CompareAllValues" OldValuesParameterFormatString="original_{0}" これを削除することによりエラーは、出なくなりました。ただ、データが書き換わりません。テンプレートの編集でEditItemTemplate をドロップダウンリストに変更し選択したものを書き込もうとしています。この場合もコードなしで選択したものを書き込めますか?

> GridView.RowUpdating イベント をハンドルして、GridViewUpdateEventArgs オブジェクトのプロパティを確認します
このハンドラを追加しe.NewValuesの値は、_objectsArray = Count = 0 になっています。
GridView1_RowUpdating(....)
 foreach (DictionaryEntry entry in e.NewValues)
 {

e.NewValues[entry.Key] = Server.HtmlEncode(entry.Value.ToString());
 }

UpdateCommand のコード下記のようになってました。今は、ConflictDetection、OldValuesParameterFormatStringの2つを消してます。エラーで止まらないものの更新しない。特にメッセージはない。
UpdateCommand="UPDATE [Holidays] SET [IsOff] = @IsOff, [WorkStartTime1] = @WorkStartTime1, [WorkEndTime1] = @WorkEndTime1, [WorkStartTime2] = @WorkStartTime2, [WorkEndTime2] = @WorkEndTime2 WHERE [Date] = @Date" ConflictDetection="CompareAllValues" OldValuesParameterFormatString="original_{0}" OnSelecting="SqlDataSource1_Selecting" OnUpdating="SqlDataSource1_Updating">


べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-05-23 12:22
引用:
UpdateCommand の後に、この文章がありConflictDetection="CompareAllValues" OldValuesParameterFormatString="original_{0}" これを削除することによりエラーは、出なくなりました。ただ、データが書き換わりません。テンプレートの編集でEditItemTemplate をドロップダウンリストに変更し選択したものを書き込もうとしています。

つまりConflictDetectionとOldValuesParameterFormatStringがSLさんの意図していなかった差異で、
ドロップダウンにしたのが意図する差異ですね(こういうことは最初に言ってください)

引用:
この場合もコードなしで選択したものを書き込めますか?

C#のコードなしで、という意味ではコードなしでできますが、置いただけでは当然できません。
このあたりが参考になると思います
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_04/vs2005db_04_02.html
http://www.microsoft.com/japan/msdn/net/aspnet/GridViewEx11.aspx
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-23 15:36
お世話になります。

ドロップダウンリストのデータバインディングにセットすることで更新させることができました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)