|
分類:[ASP.NET (C#)]
2023/04/29(Sat) 16:49:38 編集(投稿者)
エラー「ObjectDataSource 'ObjectDataSource1' では、パラメーター Name, Price, Description, Id を含む非ジェネリック メソッド 'UpdateProduct' が見つかりませんでした。」がどうしても解決できません。
以下、コードとなります。
↓Product.aspx↓ <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Products.aspx.cs" Inherits="Products" %>
<!DOCTYPE html> <html> <head> <title>Products</title> </head> <body> <form id="form1" runat="server"> <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="SQLdatasourceの使用例.クラス.ProductDataAccess" SelectMethod="GetProducts" UpdateMethod="UpdateProduct" DeleteMethod="DeleteProduct"> <SelectParameters> <asp:Parameter Name="userId" Type="Int32" /> </SelectParameters> </asp:ObjectDataSource> <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" AutoGenerateColumns="False" DataKeyNames="Id" AutoGenerateEditButton="True" AutoGenerateDeleteButton="True"> <Columns> <asp:BoundField DataField="Id" HeaderText="ID" ReadOnly="True" SortExpression="Id" /> <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> <asp:BoundField DataField="Price" HeaderText="Price" SortExpression="Price" /> <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" /> </Columns> </asp:GridView> </form> </body> </html>
↓Product.aspx.cs↓ using System; using System.Data; using System.Web.UI.WebControls;
public partial class Products : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { int loggedInUserId = GetLoggedInUserId(); ObjectDataSource1.SelectParameters["userId"].DefaultValue = loggedInUserId.ToString();
if (loggedInUserId < 1000) { GridView1.AutoGenerateEditButton = false; //編集ボタンを非表示 GridView1.AutoGenerateDeleteButton = false; //削除ボタンを非表示
} } } private int GetLoggedInUserId() { return 1001; // 仮のID }
}
↓ProductDataAccess.cs↓ using Npgsql; using System.Collections.Generic; using System.Configuration; using System.Data;
namespace SQLdatasourceの使用例.クラス { public class ProductDataAccess { private static string GetConnectionString() { return ConfigurationManager.ConnectionStrings["forSQLdtsConnectionString"].ConnectionString; }
public static List<Product> GetProducts(int? userId) { List<Product> products = new List<Product>();
using (NpgsqlConnection conn = new NpgsqlConnection(GetConnectionString())) { conn.Open(); string query;
//もしテーブルにuserIdが存在しているなら、かつuserIdが1000未満であるなら if (userId.HasValue && userId.Value < 1000) { query = "SELECT * FROM products WHERE id = @userId"; } else { query = "SELECT * FROM products"; }
using (NpgsqlCommand cmd = new NpgsqlCommand(query, conn)) { if (userId.HasValue && userId.Value < 1000) { cmd.Parameters.AddWithValue("@userId", userId.Value); }
using (NpgsqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { products.Add(new Product { Id = (int)reader["id"], Name = (string)reader["name"], Price = (decimal)reader["price"], Description = (string)reader["description"] }); } } } }
return products; }
public static void UpdateProduct(Product product) { using (NpgsqlConnection conn = new NpgsqlConnection(GetConnectionString())) { conn.Open(); using (NpgsqlCommand cmd = new NpgsqlCommand("UPDATE products SET name = @name, price = @price, description = @description WHERE id = @id", conn)) { cmd.Parameters.AddWithValue("@name", product.Name); cmd.Parameters.AddWithValue("@price", product.Price); cmd.Parameters.AddWithValue("@description", product.Description); cmd.Parameters.AddWithValue("@id", product.Id);
cmd.ExecuteNonQuery(); } } }
public static void DeleteProduct(int id) { using (NpgsqlConnection conn = new NpgsqlConnection(GetConnectionString())) { conn.Open(); using (NpgsqlCommand cmd = new NpgsqlCommand("DELETE FROM products WHERE id = @id", conn)) { cmd.Parameters.AddWithValue("@id", id);
cmd.ExecuteNonQuery(); } } } }
}
↓Product.cs↓ using System; using System.Collections.Generic; using System.Linq; using System.Web;
namespace SQLdatasourceの使用例.クラス { public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Description { get; set; } }
}
編集と削除ボタンのあるGridView1に、データベースのproductsテーブルを表示させていて、削除はできますが、編集をし、更新ボタンまたはキャンセルボタンを押すと、
「ObjectDataSource 'ObjectDataSource1' では、パラメーター Name, Price, Description, Id を含む非ジェネリック メソッド 'UpdateProduct' が見つかりませんでした。」
というエラーが発生し、解決方法がわかりません。そもそも、デバッグ実行時はエラーが表示されないため、コードは間違っていないと思うのですが、オブジェクト指向の仕組みを理解していないため、このエラーで、1日が終わりそうです。UpdateProductメソッドのどこが間違っているのでしょうか? お分かりの方がいらっしゃいましたら、ご教示願います。 環境は、VisualStudio2019で、プログラミング言語はC#webforms、SQL言語はpostgresql、ブラウザはedgeです。よろしくお願いします。
|