C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: GridViewでAccessデータが編集できない


(過去ログ 70 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■40975 / inTopicNo.1)  GridViewでAccessデータが編集できない
  
□投稿者/ サトシ (7回)-(2009/09/08(Tue) 13:30:58)

分類:[ASP.NET (VB)] 

2009/09/08(Tue) 13:44:50 編集(投稿者)
GridViewでAccessのデータの編集で、「更新」をクリックすると
「1 つ以上の必要なパラメータの値が設定されていません。 」のエラーが出て動きません。
原因、修正の方法のアドバイスを頂きたいです。よろしくお願いします。

原因の切り分けの為に小さなテストプログラムを作成しました。
Accessデータ
|ID|  namae |
| 1|佐藤一郎|
| 2|佐藤次郎|
| 3|佐藤三郎|
ID:数値型(整数型)
namae:テキスト型(フィールドサイズ50)
Access2007で作成し、Access2002-2003形式でファイル名 MyDB.mdb としました。

自分ではコードは一切書いていません。項目を選択・設定しただけです。
生成された全コードを以下に示しました。
<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="ID" DataSourceID="AccessDataSource1">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
                <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" 
                    SortExpression="ID" />
                <asp:BoundField DataField="namae" HeaderText="namae" SortExpression="namae" />
            </Columns>
        </asp:GridView>
        <asp:AccessDataSource ID="AccessDataSource1" runat="server" 
            DataFile="~/App_Data/MyDB.mdb" 
            DeleteCommand="DELETE FROM [Meibo] WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL))" 
            InsertCommand="INSERT INTO [Meibo] ([ID], [namae]) VALUES (?, ?)" 
            SelectCommand="SELECT * FROM [Meibo]" 
            UpdateCommand="UPDATE [Meibo] SET [namae] = ? WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL))">
            <DeleteParameters>
                <asp:Parameter Name="ID" Type="Int16" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="namae" Type="String" />
                <asp:Parameter Name="ID" Type="Int16" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="ID" Type="Int16" />
                <asp:Parameter Name="namae" Type="String" />
            </InsertParameters>
        </asp:AccessDataSource>
        <br />
    </div>
    </form>
</body>
</html>


エラーメッセージは以下の通りです。

1 つ以上の必要なパラメータの値が設定されていません。 
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。
例外の詳細: System.Data.OleDb.OleDbException: 1 つ以上の必要なパラメータの値が設定されていません。

ソース エラー: 
現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の例外スタック トレースを使って確認できます。  

スタック トレース: 
[OleDbException (0x80040e10): 1 つ以上の必要なパラメータの値が設定されていません。]
   System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) +1003520
  (19行略)
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

お手数ですが解決のアドバイスをよろしくお願いします。 

引用返信 編集キー/
■40976 / inTopicNo.2)  Re[1]: GridViewでAccessデータが編集できない
□投稿者/ もりお (71回)-(2009/09/08(Tue) 14:33:01)
No40975 (サトシ さん) に返信
> UpdateCommand="UPDATE [Meibo] SET [namae] = ? WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL))">
> <UpdateParameters>
>     <asp:Parameter Name="namae" Type="String" />
>     <asp:Parameter Name="ID" Type="Int16" />
> </UpdateParameters>

SQL の ? の数は3つですが
セットされるパラメータが2つしかないのです。
もう一個追加してみてくださいな。
<UpdateParameters>
    <asp:Parameter Name="namae" Type="String" />
    <asp:Parameter Name="ID" Type="Int16" />
    <asp:Parameter Name="ID" Type="Int16" />
</UpdateParameters>

引用返信 編集キー/
■40980 / inTopicNo.3)  Re[2]: GridViewでAccessデータが編集できない
□投稿者/ サトシ (8回)-(2009/09/08(Tue) 18:15:20)
2009/09/09(Wed) 08:22:15 編集(投稿者)
2009/09/08(Tue) 18:47:34 編集(投稿者)

■No40976 (もりお さん) に返信
> SQL の ? の数は3つですが
> セットされるパラメータが2つしかないのです。
> もう一個追加してみてくださいな。
> <UpdateParameters>
>     <asp:Parameter Name="namae" Type="String" />
>     <asp:Parameter Name="ID" Type="Int16" />
>     <asp:Parameter Name="ID" Type="Int16" />
> </UpdateParameters>

もりおさん、アドバイスありがとうございます。
アドバイスの通り一個追加して動かしてみましたが、状況は同じ、エラーメッセージも同じ
で、残念ながら動きませんでした。

アドバイスをヒントにSQL Serverでも同じものを作成してみました。
SQL Serverでは「編集」「更新」が正しく動きました。
SQL Serverの方でも自分ではコードは一切書いていません。
自動生成コードをAccessの場合と比較してみたのですが、ヒントは見付けられませんでした。

自動生成された全コードを以下に示しました。
問題解決のアドバイスがありましたら、よろしくお願いします。

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        SQL Serverデータの編集 H21/09/08<br />
        <br />
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="ID" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
                <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" 
                    SortExpression="ID" />
                <asp:BoundField DataField="namae" HeaderText="namae" SortExpression="namae" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
            DeleteCommand="DELETE FROM [MeiboSQL] WHERE [ID] = @ID" 
            InsertCommand="INSERT INTO [MeiboSQL] ([ID], [namae]) VALUES (@ID, @namae)" 
            SelectCommand="SELECT * FROM [MeiboSQL]" 
            UpdateCommand="UPDATE [MeiboSQL] SET [namae] = @namae WHERE [ID] = @ID">
            <DeleteParameters>
                <asp:Parameter Name="ID" Type="Int32" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="namae" Type="String" />
                <asp:Parameter Name="ID" Type="Int32" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="ID" Type="Int32" />
                <asp:Parameter Name="namae" Type="String" />
            </InsertParameters>
        </asp:SqlDataSource>
        <br />
    </div>
    </form>
</body>
</html>

引用返信 編集キー/
■40982 / inTopicNo.4)  Re[3]: GridViewでAccessデータが編集できない
□投稿者/ もりお (73回)-(2009/09/08(Tue) 20:21:54)
2009/09/08(Tue) 20:47:30 編集(投稿者)

No40980 (サトシ さん) に返信
> 問題解決のアドバイスがありましたら、よろしくお願いします。

AccessDataSource の OldValuesParameterFormatString プロパティの値が {0} に
なっているとそのような状況になる模様です。


解決策1

AccessDataSource の OldValuesParameterFormatString プロパティに original_{0} を
セットして AccessDataSource タスクからデータソースの構成を行う。


解決策2

データソースの構成の SQL 生成の詳細オプションで
オプティミスティック同時実効制御のチェックボックスをオンにする。

引用返信 編集キー/
■40989 / inTopicNo.5)  Re[4]: GridViewでAccessデータが編集できない
□投稿者/ サトシ (9回)-(2009/09/09(Wed) 08:58:37)
2009/09/09(Wed) 14:37:46 編集(投稿者)
No40982 (もりお さん) に返信
もりおさん、アドバイスありがとうございます。
> 解決策1
> AccessDataSource の OldValuesParameterFormatString プロパティに original_{0} を
> セットして AccessDataSource タスクからデータソースの構成を行う。

<asp:AccessDataSource ID="AccessDataSource1" runat="server" 
    DataFile="./App_Data/MyDB.mdb" 
    DeleteCommand="DELETE FROM [Meibo] WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL))" 
    InsertCommand="INSERT INTO [Meibo] ([ID], [namae]) VALUES (?, ?)" 
    SelectCommand="SELECT * FROM [Meibo]" 

    UpdateCommand="UPDATE [Meibo] SET [namae] = ? WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL))" 
    OldValuesParameterFormatString="Original_{0}">

を設定し、動かしましたが、「更新」でエラー発生、エラーメッセージも以前と同じでした。

次に、OldValuesParameterFormatString プロパティ設定を、最初の状態 {0} に戻し、
> 解決策2
> データソースの構成の SQL 生成の詳細オプションで
> オプティミスティック同時実効制御のチェックボックスをオンにする。

<asp:AccessDataSource ID="AccessDataSource1" runat="server" 
    DataFile="./App_Data/MyDB.mdb" 
    DeleteCommand="DELETE FROM [Meibo] WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL)) AND (([namae] = ?) OR ([namae] IS NULL ANULL))" 
    InsertCommand="INSERT INTO [Meibo] ([ID], [namae]) VALUES (?, ?)" 
    SelectCommand="SELECT * FROM [Meibo]" 
    UpdateCommand="UPDATE [Meibo] SET [namae] = ? WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL)) AND (([namae] = ?) OR ([namaeL AND ? IS NULL))" 
    OldValuesParameterFormatString="original_{0}" 
    ConflictDetection="CompareAllValues">

を設定し、動かしましたが、「更新」でエラー発生、エラーメッセージも以前と同じでした。
残念ながら、解決策2つ共、動きませんでした。どこか他の設定に不備があるのでしょうか?

引用返信 編集キー/
■41019 / inTopicNo.6)  Re[5]: GridViewでAccessデータが編集できない
□投稿者/ もりお (76回)-(2009/09/09(Wed) 17:13:03)
No40989 (サトシ さん) に返信
> 残念ながら、解決策2つ共、動きませんでした。どこか他の設定に不備があるのでしょうか?

UpdateCommand="UPDATE [Meibo] SET [namae] = ? WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL))"

<UpdateParameters>
    <asp:Parameter Name="namae" Type="String" />
    <asp:Parameter Name="original_ID" Type="Int32" />
</UpdateParameters>

解決策1では、このように生成されるかと思います。
そのまま実行すると ? の数とパラメータの数が合わないのでエラーが出るわけなのです。
こんな具合に適宜修正くださいな。

<UpdateParameters>
    <asp:Parameter Name="namae" Type="String" />
    <asp:Parameter Name="original_ID" Type="Int32" />
    <asp:Parameter Name="original_ID" Type="Int32" />
</UpdateParameters>

引用返信 編集キー/
■41021 / inTopicNo.7)  Re[6]: GridViewでAccessデータが編集できない
□投稿者/ サトシ (11回)-(2009/09/09(Wed) 18:33:34)
2009/09/09(Wed) 18:34:21 編集(投稿者)
No41019 (もりお さん) に返信
もりおさんのアドバイスで見事動く様になりました。本当にありがとうございました。

最終的には同時実行の競合を避ける設定にする予定ですので、解決策2の「オプティミス
ティック同時実行制御」にチェックを入れる方法で対応しました。

UpdateCommand="UPDATE [Meibo] SET [namae] = ? WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL)) AND (([namae] = ?) OR ([namae] IS NULL AND ? IS NULL))" 
と「?」が5つになりますので
<UpdateParameters>
    <asp:Parameter Name="namae" Type="String" />
    <asp:Parameter Name="original_ID" Type="Int16" />
    <asp:Parameter Name="original_ID" Type="Int16" />
    <asp:Parameter Name="original_namae" Type="String" />
    <asp:Parameter Name="original_namae" Type="String" />
</UpdateParameters>
の5行に修正し、「編集」機能が正常に動く様になりました。

「編集」機能が正常に動いた全コードを以下に添付しました。
(本件はVWD2008のバグに位置づけられるのでしょうか?)

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="ID" DataSourceID="AccessDataSource1">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
                <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" 
                    SortExpression="ID" />
                <asp:BoundField DataField="namae" HeaderText="namae" SortExpression="namae" />
            </Columns>
        </asp:GridView>
        <asp:AccessDataSource ID="AccessDataSource1" runat="server" 
            DataFile="./App_Data/MyDB.mdb" 
            DeleteCommand="DELETE FROM [Meibo] WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL)) AND (([namae] = ?) OR ([namae] IS NULL AND ? IS NULL))" 
            InsertCommand="INSERT INTO [Meibo] ([ID], [namae]) VALUES (?, ?)" 
            SelectCommand="SELECT * FROM [Meibo]" 
            UpdateCommand="UPDATE [Meibo] SET [namae] = ? WHERE (([ID] = ?) OR ([ID] IS NULL AND ? IS NULL)) AND (([namae] = ?) OR ([namae] IS NULL AND ? IS NULL))" 
            OldValuesParameterFormatString="original_{0}" 
            ConflictDetection="CompareAllValues">
            <DeleteParameters>
                <asp:Parameter Name="original_ID" Type="Int16" />
                <asp:Parameter Name="original_namae" Type="String" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="namae" Type="String" />
                <asp:Parameter Name="original_ID" Type="Int16" />
                <asp:Parameter Name="original_ID" Type="Int16" />
                <asp:Parameter Name="original_namae" Type="String" />
                <asp:Parameter Name="original_namae" Type="String" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="ID" Type="Int16" />
                <asp:Parameter Name="namae" Type="String" />
            </InsertParameters>
        </asp:AccessDataSource>
        <br />
    </div>
    </form>
</body>
</html>

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -