您的位置:首页 > 移动开发 > Objective-C

asp.net中ObjectDataSource“”未能找到带参数的非泛型方法“DelnewsClass”: p1, id 问题

2017-05-04 23:01 459 查看
asp.net真是让人欢喜让人忧,明明一个很智能,很nice的ObjectDataSource的listView工具,却搞个参数问题来困扰人

我用的是ObjectDataSource,然后用listView,希望智能生成一个增删改删.结果可以查出,但删除都报类似标题的错误.

查了很久,发现它问题就出在这两个文件中



数据列表1.aspx文件中的

 <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DataObjectTypeName="MyWebApplication.增删改查.App_Data.DataSetUser" InsertMethod="Insert"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetData" TypeName="MyWebApplication.增删改查.App_Data.DataSetUserTableAdapters.t_userTableAdapter" UpdateMethod="Update">

            <InsertParameters>

                <asp:Parameter Name="p1" Type="Int32" />

                <asp:Parameter Name="p2" Type="String" />

                <asp:Parameter Name="p3" Type="Int32" />

                <asp:Parameter Name="p4" Type="Int32" />

            </InsertParameters>

        </asp:ObjectDataSource>

OldValuesParameterFormatString 这个我感觉可以看作是往下面一串红的地方传参数的,所以这个可以设为{0}
不知道为啥自动生成还加了个玩意搞破坏

asp:Parameter Name  这个的值要和上面传进来的一致,但是显示自动生成的也不一致

DataSetStudents.Designer.cs这个文件中看

 public virtual int Insert(string p1, int p2, string p3, int p4) {

            if ((p1== null)) {

                throw new global::System.ArgumentNullException("p1");

            }

            else {

                this.Adapter.InsertCommand.Parameters[0].Value = ((string)(p1));

            }

            this.Adapter.InsertCommand.Parameters[1].Value = ((int)(p2));

            if ((p3== null)) {

                throw new global::System.ArgumentNullException("p3");

            }

            else {

                this.Adapter.InsertCommand.Parameters[2].Value = ((string)(p3));

            }

            this.Adapter.InsertCommand.Parameters[3].Value = ((int)(isVip));

            global::System.Data.ConnectionState previousConnectionState = this.Adapter.InsertCommand.Connection.State;

            if (((this.Adapter.InsertCommand.Connection.State & global::System.Data.ConnectionState.Open)

                        != global::System.Data.ConnectionState.Open)) {

                this.Adapter.InsertCommand.Connection.Open();

            }

            try {

                int returnValue = this.Adapter.InsertCommand.ExecuteNonQuery();

                return returnValue;

            }

            finally {

                if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {

                    this.Adapter.InsertCommand.Connection.Close();

                }

            }

        }

这个文件里的形参,要和上面保持一致. 说实在的,这个不理解为何形参也要保证名称一致

我有试过把数据列表1.aspx文件一致,但还是跑不过,人家就这样了.修改如下

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DeleteMethod="Delete" InsertMethod="Insert" OldValuesParameterFormatString="{0}" SelectMethod="GetData" TypeName="MyWebApplication.增删改查.App_Data.DataSetStudentsTableAdapters.t_studentsTableAdapter"
UpdateMethod="Update">

            <DeleteParameters>

                <asp:Parameter Name="id" Type="Int32" />

            </DeleteParameters>

            <InsertParameters>

                <asp:Parameter Name="name" Type="String" />

                <asp:Parameter Name="age" Type="Int32" />

                <asp:Parameter Name="gender" Type="String" />

                <asp:Parameter Name="isVip" Type="Int32" />

            </InsertParameters>

 public virtual int Insert(string name, int age, string gender, int isVip)

这样就可以保持一致了.可以运行了.

但是这种改法,完全是把一个很智能的东东改得跟个二百五似的.所以换一种改法,在OldValuesParameterFormatString 想办法改改成传进去的参数就是p1,p2啥的

那就把

<EditItemTemplate>

                <tr style="background-color: #FFCC66;color: #000080;">

                    <td>

                        <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="更新" />

                        <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="取消" />

                    </td>

                    <td>

                        <asp:Label ID="idLabel1" runat="server" Text='<%# Eval("id") %>' />

                    </td>

                    <td>

                        <asp:TextBox ID="nameTextBox" runat="server" Text='<%# Bind("name") %>' />

                    </td>

                    <td>

                        <asp:TextBox ID="ageTextBox" runat="server" Text='<%# Bind("age") %>' />

                    </td>

                    <td>

                        <asp:TextBox ID="genderTextBox" runat="server" Text='<%# Bind("gender") %>' />

                    </td>

                    <td>

                        <asp:TextBox ID="isVipTextBox" runat="server" Text='<%# Bind("isVip") %>' />

                    </td>

                </tr>

            </EditItemTemplate>

改成类似

<InsertItemTemplate>

                <tr style="">

                    <td>

                        <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="插入" />

                        <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="清除" />

                    </td>

                    <td> </td>

                    <td>

                        <asp:TextBox ID="nameTextBox" runat="server" Text='<%# Bind("p1") %>' />

                    </td>

                    <td>

                        <asp:TextBox ID="ageTextBox" runat="server" Text='<%# Bind("p2") %>' />

                    </td>

                    <td>

                        <asp:TextBox ID="genderTextBox" runat="server" Text='<%# Bind("p3") %>' />

                    </td>

                    <td>

                        <asp:TextBox ID="isVipTextBox" runat="server" Text='<%# Bind("p4") %>' />

                    </td>

                </tr>

            </InsertItemTemplate>

发现有部分是可以的,但是Eval,Bind需要展现的部分又是不行的,应该是自动生成是名子就起好了.所以改起来,还是个二百五.反正记得三个都得一样一样的就行了.碎觉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: