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

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

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

Re[2]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法


(過去ログ 177 を表示中)

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

■101847 / inTopicNo.1)  「非ジェネリックメソッドが見つかりませんでした。」の解決方法
  
□投稿者/ トマト太郎 (8回)-(2023/04/29(Sat) 16:49:03)

分類:[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です。よろしくお願いします。
引用返信 編集キー/
■101848 / inTopicNo.2)  Re[1]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ 伝説のカレー (100回)-(2023/04/29(Sat) 16:58:17)
No101847 (トマト太郎 さん) に返信

エラーメッセージに従うならこんなメソッドを作ればいんじゃないですかね

public static void UpdateProduct(string Name, decimal Price, string Description, int Id)
{

}

引用返信 編集キー/
■101849 / inTopicNo.3)  Re[2]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ トマト太郎 (9回)-(2023/04/29(Sat) 17:50:02)
No101848 (伝説のカレー さん) に返信
> ■No101847 (トマト太郎 さん) に返信
>
> エラーメッセージに従うならこんなメソッドを作ればいんじゃないですかね
>
> public static void UpdateProduct(string Name, decimal Price, string Description, int Id)
> {
>
> }
>
ありがとうございます。処理がとおりました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SQLdatasourceの使用例.クラス
{
//akai777 or akai7
public class Product
{
● public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
}

}
の、public int Id { get; set; }に●を置いてデバッグしたところ、14回処理がとおりました。行は7行あるのですが、これはつまり、古い行と新しい行の2回処理がとおっているのでしょうか?インターネットで調べながら、見よう見まねで書きましたので、内部処理をわかっていません。もしおわかりでしたら、推定でも結構ですので、7行のテーブルに対し、14回 public int Id { get; set; } に処理がとおる理由を教えていただきたいです。7回だと、理解できるのですが……。
引用返信 編集キー/
■101850 / inTopicNo.4)  Re[1]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ WebSurfer (2682回)-(2023/04/29(Sat) 18:20:12)
No101847 (トマト太郎 さん) に返信

> エラー「ObjectDataSource 'ObjectDataSource1' では、パラメーター Name, Price, Description, Id を
> 含む非ジェネリック メソッド 'UpdateProduct' が見つかりませんでした。」がどうしても解決できません。

以下の記事の「(2.2.1) OldValuesParameterFormatString の設定」のセクションに書いて
あることに心当たりはありませんか?

SqlDataSource などのパラメータ
http://surferonwww.info/BlogEngine/post/2010/09/26/How-a-data-bound-control-passes-parameters-to-data-source-control.aspx

引用返信 編集キー/
■101851 / inTopicNo.5)  Re[2]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ WebSurfer (2683回)-(2023/04/29(Sat) 18:21:31)
No101848 (伝説のカレー さん) に返信

> エラーメッセージに従うならこんなメソッドを作ればいんじゃないですかね
>
> public static void UpdateProduct(string Name, decimal Price, string Description, int Id)
> {
>
> }

思い付きレベルの適当なことを言っているように見えますが、違いますか?
引用返信 編集キー/
■101853 / inTopicNo.6)  Re[2]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ トマト太郎 (10回)-(2023/04/29(Sat) 19:02:54)
No101850 (WebSurfer さん) に返信
> ■No101847 (トマト太郎 さん) に返信
>
>>エラー「ObjectDataSource 'ObjectDataSource1' では、パラメーター Name, Price, Description, Id を
>>含む非ジェネリック メソッド 'UpdateProduct' が見つかりませんでした。」がどうしても解決できません。
>
> 以下の記事の「(2.2.1) OldValuesParameterFormatString の設定」のセクションに書いて
> あることに心当たりはありませんか?
>
> SqlDataSource などのパラメータ
> http://surferonwww.info/BlogEngine/post/2010/09/26/How-a-data-bound-control-passes-parameters-to-data-source-control.aspx
>

OldValuesParameterFormatString のプロパティの{0}を削除しようとしましたが、削除しても、デバッグ時復活するため、

public static void UpdateProduct(Product product,string name,decimal price,string description,int id)
public static void DeleteProduct(int id,Product product)
で対応しようとしましたが、


「ObjectDataSource 'ObjectDataSource1' では、パラメーター Id を含む非ジェネリック メソッド 'DeleteProduct' が見つかりませんでした。」
「ObjectDataSource 'ObjectDataSource1' では、パラメーター Name, Price, Description, Id を含む非ジェネリック メソッド 'UpdateProduct' が見つかりませんでした。

のエラーは解消できませんでした。

教えていただいた、
public static void UpdateProduct(string Name, decimal Price, string Description, int Id)
{
}
は正しくないのでしょうか?
処理は通るので、正しいものだと思っていたのですが…。
引用返信 編集キー/
■101856 / inTopicNo.7)  Re[3]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ 伝説のカレー (101回)-(2023/04/29(Sat) 19:49:02)
No101849 (トマト太郎 さん) に返信

> 7行のテーブルに対し、14回 public int Id { get; set; } に処理がとおる理由を教えていただきたいです。7回だと、理解できるのですが……。

getとsetで2回通るんじゃないですかね、デバッガで前後の処理を眺めてみればわかるかも
引用返信 編集キー/
■101857 / inTopicNo.8)  Re[4]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ トマト太郎 (11回)-(2023/04/29(Sat) 21:43:34)
No101856 (伝説のカレー さん) に返信
> ■No101849 (トマト太郎 さん) に返信
>
>>7行のテーブルに対し、14回 public int Id { get; set; } に処理がとおる理由を教えていただきたいです。7回だと、理解できるのですが……。
>
> getとsetで2回通るんじゃないですかね、デバッガで前後の処理を眺めてみればわかるかも
ありがとうございます。後ほど確認させていただきます。
引用返信 編集キー/
■101858 / inTopicNo.9)  Re[3]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ トマト太郎 (12回)-(2023/04/29(Sat) 21:44:58)
No101851 (WebSurfer さん) に返信
> ■No101848 (伝説のカレー さん) に返信
>
>>エラーメッセージに従うならこんなメソッドを作ればいんじゃないですかね
>>
>>public static void UpdateProduct(string Name, decimal Price, string Description, int Id)
>>{
>>
>>}
>
> 思い付きレベルの適当なことを言っているように見えますが、違いますか?
WebSurfer様でしたら、どのようなコードでエラーを解決されますか?コードのご教示のほどお願いいたします。
引用返信 編集キー/
■101862 / inTopicNo.10)  Re[4]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ WebSurfer (2684回)-(2023/04/30(Sun) 11:45:05)
No101858 (トマト太郎 さん) に返信

> WebSurfer様でしたら、どのようなコードでエラーを解決されますか?コードのご教示のほどお願いいたします。

エラーを解決ではなくて、そういうエラーが出ないように最初から最後まで Visual Studio の
ウィザードを使って作ります。自分では一行もコードを書かなくてもアプリを作成できます。

紹介した記事に書いたように、データバウンドコントロール (GridView など) からデータソース
コントロール (ObjectDataSource など) へのパラメータの渡し方は複雑で、そのあたりに精通し
てないと自力でコードを書くのは難しいです。

では、今回の ObjectDataSource + GridView のケースではどうするかと言うと、まず Visual
Studio のデータソース構成ウィザードを使って型付 DataSet / DataTable + TableAdapter の
コードを自動生成します。

その TableAdapter クラスの中に Select, Insert, Delete, Update メソッドが定義されます。
それらのメソッドをベースに ObjectDataSource をウィザードベースで作った場合は、そのメソ
ッドに定義されている引数に合わせてパラメータが作られます。

データバウンドコントロールの Keys, Values, OldValues, NewValues コレクションは、パラ
メータを通じて、該当する引数に渡されます。ウィザードに任せて TableAdapter と
ObjectDataSource を作れば、たぶんほとんどのケースで、渡される Keys, Values, OldValues,
NewValues コレクションと、それを受け取るパラメータの間に不整合を生ずることはないはず
です。

ただ、PosrgreSQL が相手で
引用返信 編集キー/
■101863 / inTopicNo.11)  Re[4]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ WebSurfer (2685回)-(2023/04/30(Sun) 11:50:49)
No101858 (トマト太郎 さん) に返信

上のレスの最後の「ただ、PosrgreSQL が相手で」の後を書かずに投稿してしまったので、その
続きを追記します。

PostgreSQL が相手でも拡張機能 Npgsql PostgreSQL Integration をインストールするとデータ
ソース構成ウィザードが使えるはずです。

PostgreSQL とデータソース構成ウィザード
http://surferonwww.info/BlogEngine/post/2022/10/05/postgresql-and-data-source-configuration-wizard.aspx
引用返信 編集キー/
■101867 / inTopicNo.12)  Re[5]: 「非ジェネリックメソッドが見つかりませんでした。」の解決方法
□投稿者/ トマト太郎 (13回)-(2023/04/30(Sun) 19:40:40)
No101863 (WebSurfer さん) に返信
> ■No101858 (トマト太郎 さん) に返信
>
> 上のレスの最後の「ただ、PosrgreSQL が相手で」の後を書かずに投稿してしまったので、その
> 続きを追記します。
>
> PostgreSQL が相手でも拡張機能 Npgsql PostgreSQL Integration をインストールするとデータ
> ソース構成ウィザードが使えるはずです。
>
> PostgreSQL とデータソース構成ウィザード
> http://surferonwww.info/BlogEngine/post/2022/10/05/postgresql-and-data-source-configuration-wizard.aspx

ありがとうございます。
本日は仕事でとりかかれませんので、明後日こちらの方法を実施させていただきます。
たくさんのアドバイスありがとうございます。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -