none
SqlDataSourceでinsert前にパラメータを追加したい RRS feed

  • 質問


  • お世話になります。

    表題の通りですが、

    SqlDataSourceでOnInsertingイベントを作り、insert前にパラメータを追加したいのですが、

    なぜか 『Parameter 'corp_id' not found in the collection.』となってしまいます。

    パラメタータ自体は存在するように思うのですが、@を削除したりと試行錯誤しているのですが、

    解決できません。何かおかしい点があれば教授頂けないでしょうか。

    <asp:SqlDataSource ID="MySqlDataSource2" runat="server"
            ProviderName="<%$ ConnectionStrings:MySqlDataSorce.ProviderName %>"
            ConnectionString="<%$ ConnectionStrings:MySqlDataSorce %>"
            DeleteCommand="DELETE FROM m_grooup2 WHERE (id = @id and corp_id=@corp_id)"
            InsertCommand="INSERT INTO m_grooup2(id, corp_id, groupid, group2_name) VALUES (@id, @corp_id, @groupid, @group2_name)"
            SelectCommand="SELECT id, groupid, group2_name FROM m_grooup2 "
            UpdateCommand="UPDATE m_grooup2 SET groupid = @groupid, group2_name = @group2_name WHERE (id = @id)"
            OnInserting="MySqlDataSource2_Inserting" OnDeleting="MySqlDataSource2_Deleting" OnUpdating="MySqlDataSource2_Updating"></asp:SqlDataSource>
    protected void MySqlDataSource2_Inserting(object sender, SqlDataSourceCommandEventArgs e)
    {
                e.Command.Parameters["@id"].Value = 100;
                e.Command.Parameters["@corp_id"].Value = Session["login_corp"];
    }
    

    -----開発環境

    ASP.net(c#)
    VisualStudioComminity2015
    Mysql6.5

    Windows10Pro

    2016年11月30日 3:11

回答

  • SqlDataSource の InsertParameters の定義はどうなっているのでしょうか? @id, @corp_id, @groupid, @group2_name は全て定義されていますか? 定義されていれば以下のような感じ(あくまで感じ)になるのですか。

    <InsertParameters>
        <asp:Parameter Name="id" Type="Int32" />
        <asp:Parameter Name="corp_id" Type="Int32" />
        <asp:Parameter Name="groupid" Type="Int32" />
        <asp:Parameter Name="group2_name" Type="String" />
    </InsertParameters>

    そこに定義されていれば、内部的に、

    <asp:Parameter Name="xxx" Type="Int32" />
        ↓
    SqlCommand.Parameters.Add(new SqlParameter("@xxx", SqlDbType.Int))

    というようなことをしてくれるので、質問者さんが行ったように SqlDataSource.Inserting イベントで、

    e.Command.Parameters["@xxx"].Value = yyy;

    とだけしてやれば OK なはずです。

    InsertParameters に追加するのが NG なら SqlDataSource.Inserting イベントで、

    e.Command.Parameters.Add(new SqlParameter("@xxx", SqlDbType.Int))

    のようにして追加することもできます(もちろん Value を設定する前にですよ)。お試しください。



    【追伸】

    問題になっている corp_id は Session から取得したいのですね? であれば、SessionParameter を使うという手もあります。こちらの方が簡単かも。

    SessionParameter クラス
    https://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.sessionparameter(v=vs.110).aspx

    • 編集済み SurferOnWww 2016年11月30日 4:27 【追伸】追加
    • 回答としてマーク hys73 2016年11月30日 5:38
    2016年11月30日 3:51

すべての返信

  • SqlDataSource の InsertParameters の定義はどうなっているのでしょうか? @id, @corp_id, @groupid, @group2_name は全て定義されていますか? 定義されていれば以下のような感じ(あくまで感じ)になるのですか。

    <InsertParameters>
        <asp:Parameter Name="id" Type="Int32" />
        <asp:Parameter Name="corp_id" Type="Int32" />
        <asp:Parameter Name="groupid" Type="Int32" />
        <asp:Parameter Name="group2_name" Type="String" />
    </InsertParameters>

    そこに定義されていれば、内部的に、

    <asp:Parameter Name="xxx" Type="Int32" />
        ↓
    SqlCommand.Parameters.Add(new SqlParameter("@xxx", SqlDbType.Int))

    というようなことをしてくれるので、質問者さんが行ったように SqlDataSource.Inserting イベントで、

    e.Command.Parameters["@xxx"].Value = yyy;

    とだけしてやれば OK なはずです。

    InsertParameters に追加するのが NG なら SqlDataSource.Inserting イベントで、

    e.Command.Parameters.Add(new SqlParameter("@xxx", SqlDbType.Int))

    のようにして追加することもできます(もちろん Value を設定する前にですよ)。お試しください。



    【追伸】

    問題になっている corp_id は Session から取得したいのですね? であれば、SessionParameter を使うという手もあります。こちらの方が簡単かも。

    SessionParameter クラス
    https://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.sessionparameter(v=vs.110).aspx

    • 編集済み SurferOnWww 2016年11月30日 4:27 【追伸】追加
    • 回答としてマーク hys73 2016年11月30日 5:38
    2016年11月30日 3:51
  • 回答ありがとうございます。

    @id自体がパラメータだと思っており、
    <InsertParameters>を定義するという意識がありませんでした。
    教授頂いた通り行ったところ、無事パラメータを追加し
    データベースへの更新を行うことができました。
    2016年11月30日 5:38