質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

解決済

C# ASP.NET チュートリアルにて decimal→string変換がうまくいかない

yayaya22
yayaya22

総合スコア51

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

1回答

0リアクション

0クリップ

409閲覧

投稿2022/08/28 10:17

編集2022/08/29 00:58

パート 6: ASP.NET Core のコントローラーのメソッドとビュー

decimal変換でエラーが発生しています。

エラー内容

InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Decimal'. Microsoft.Data.SqlClient.SqlBuffer.get_Decimal() lambda_method35(Closure , QueryContext , DbDataReader , ResultContext , SingleQueryResultCoordinator ) Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable<T>+AsyncEnumerator.MoveNextAsync() Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync<TSource>(IQueryable<TSource> source, CancellationToken cancellationToken) Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync<TSource>(IQueryable<TSource> source, CancellationToken cancellationToken) MvcMovie.Controllers.MoviesController.Index() in MoviesController.cs + return _context.Movie != null ? Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor+TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments) System.Threading.Tasks.ValueTask<TResult>.get_Result() System.Runtime.CompilerServices.ValueTaskAwaiter<TResult>.GetResult() Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask<IActionResult> actionResultValueTask) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.

MovieController.cs

C#

using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using MvcMovie.Data; using MvcMovie.Models; namespace MvcMovie.Controllers { public class MoviesController : Controller { private readonly MvcMovieContext _context; public MoviesController(MvcMovieContext context) { _context = context; } // GET: Movies public async Task<IActionResult> Index() { return _context.Movie != null ? View(await _context.Movie.ToListAsync()) : Problem("Entity set 'MvcMovieContext.Movie' is null."); } // GET: Movies/Details/5 public async Task<IActionResult> Details(int? id) { if (id == null || _context.Movie == null) { return NotFound(); } var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id); if (movie == null) { return NotFound(); } return View(movie); } // GET: Movies/Create public IActionResult Create() { return View(); } // POST: Movies/Create // To protect from overposting attacks, enable the specific properties you want to bind to. // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("Id,Title,ReleaseDate,Genre,Price")] Movie movie) { if (ModelState.IsValid) { _context.Add(movie); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(movie); } // GET: Movies/Edit/5 public async Task<IActionResult> Edit(int? id) { if (id == null || _context.Movie == null) { return NotFound(); } var movie = await _context.Movie.FindAsync(id); if (movie == null) { return NotFound(); } return View(movie); } // POST: Movies/Edit/5 // To protect from overposting attacks, enable the specific properties you want to bind to. // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price")] Movie movie) { if (id != movie.Id) { return NotFound(); } if (ModelState.IsValid) { try { _context.Update(movie); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!MovieExists(movie.Id)) { return NotFound(); } else { throw; } } return RedirectToAction(nameof(Index)); } return View(movie); } // GET: Movies/Delete/5 public async Task<IActionResult> Delete(int? id) { if (id == null || _context.Movie == null) { return NotFound(); } var movie = await _context.Movie .FirstOrDefaultAsync(m => m.Id == id); if (movie == null) { return NotFound(); } return View(movie); } // POST: Movies/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<IActionResult> DeleteConfirmed(int id) { if (_context.Movie == null) { return Problem("Entity set 'MvcMovieContext.Movie' is null."); } var movie = await _context.Movie.FindAsync(id); if (movie != null) { _context.Movie.Remove(movie); } await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } private bool MovieExists(int id) { return (_context.Movie?.Any(e => e.Id == id)).GetValueOrDefault(); } } }

SeedData.cs

C#

using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using MvcMovie.Data; using System; using System.Linq; namespace MvcMovie.Models { public static class SeedData { public static void Initialize(IServiceProvider serviceProvider) { using (var context = new MvcMovieContext( serviceProvider.GetRequiredService< DbContextOptions<MvcMovieContext>>())) { // Look for any movies. if (context.Movie.Any()) { return; // DB has been seeded } context.Movie.AddRange( new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-2-12"), Genre = "Romantic Comedy", Price = 7.99M }, new Movie { Title = "Ghostbusters ", ReleaseDate = DateTime.Parse("1984-3-13"), Genre = "Comedy", Price = 8.99M }, new Movie { Title = "Ghostbusters 2", ReleaseDate = DateTime.Parse("1986-2-23"), Genre = "Comedy", Price = 9.99M }, new Movie { Title = "Rio Bravo", ReleaseDate = DateTime.Parse("1959-4-15"), Genre = "Western", Price = 3.99M } ); context.SaveChanges(); } } } }

Movie.cs

using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace MvcMovie.Models { public class Movie { public int Id { get; set; } public string? Title { get; set; } [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string? Genre { get; set; } [Column(TypeName = "decimal(18, 2)")] public decimal? Price { get; set; } } }

イメージ追記:
イメージ説明

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/08/28 12:53依頼された後にこの質問は修正されています

こちらの質問が他のユーザーから「問題・課題が含まれていない質問」という指摘を受けました。

SurferOnWww

2022/08/28 11:15 編集

ASP.NET のタグをつけてください。MVC なら Razor のタグは外してください。 で、質問は何ですか? 書いてないけど・・・ 
yayaya22

2022/08/28 13:13

decimalからstring変換がうまくいかないようで、結果がリストとして返らずreturn文にエラーが出ているようです こちらのエラーを解決し、SeedDataの内容を反映させたいですね
SurferOnWww

2022/08/28 14:07 編集

> decimalからstring変換がうまくいかないようで エラーメッセージはその逆の Unable to cast object of type 'System.String' to type 'System.Decimal'. となってますけど? なんにせよ、チュートリアル通りにやったのならそういうエラーが出るのは考えにくいのですが、何かチュートリアルと違ったことをしてませんか? その前のパートまではチュートリアルと少しも違えることなく 100% チュートリアル通りに実装して一切問題なくできているのですか? > SeedDataの内容を反映させたいですね 直接 DB を見てシードされてないのは確認したのですか?
yayaya22

2022/08/28 15:14

sql serverオブジェクトエクスプロ―ラーで、デザイン表示でDBを確認すると、 Price のデータ型がnvarchar(MAX)になっていました。 decimal(18,0)に直したところ、sqlエラーになり、直せない状態になってしまいました。 sql構文をいじるのは、まだ未経験なのでやり直したほうがよろしいでしょうか。
SurferOnWww

2022/08/28 22:37

質問に答えてください。以下に再掲します。 チュートリアル通りにやったのならそういうエラーが出るのは考えにくいのですが、何かチュートリアルと違ったことをしてませんか?  その前のパートまではチュートリアルと少しも違えることなく 100% チュートリアル通りに実装して一切問題なくできているのですか?
SurferOnWww

2022/08/28 23:08

> Price のデータ型がnvarchar(MAX)になっていました。 そうなっていると言うことは、Migration (EF Code First で DB を生成) した際 Model の当該プロパティの型が string (または string?) になっていたということだと思います。 質問のコードを見ると decimal? となってますが、 Migration の後いじりまくって色々変えたのでは?
yayaya22

2022/08/28 23:31 編集

はい、いじりまくったと思います。
SurferOnWww

2022/08/29 00:13

何をどういじったのかを書いてほしいのですが、今となっては分からないということですか? 質問に貼ったコードはいじったあとの現状ですか? > sql serverオブジェクトエクスプロ―ラーで、デザイン表示でDBを確認すると、 そのスクリーンショットを撮って質問欄に貼ってください。
yayaya22

2022/08/29 01:01

>何をどういじったのかを書いてほしいのですが、今となっては分からないということですか? 始めに Price = 7.99M にしていてエラーがでたので、(確か同じエラーdecimal) Price = "7.99M" のように文字列にして、migrateしたのかもしれません。 貼り付けました
SurferOnWww

2022/08/29 01:13 編集

質問に答えよう。話が通じなくなる 何をどういじったのかを書いてほしいのですが、今となっては分からないということですか? 質問に貼ったコードはいじったあとの現状ですか?
yayaya22

2022/08/29 01:38

>何をどういじったのかを書いてほしいのですが、今となっては分からないということですか? はい、不明です >質問に貼ったコードはいじったあとの現状ですか? いじったあとになります。
SurferOnWww

2022/08/29 01:57

>> 何をどういじったのかを書いてほしいのですが、今となっては分からないということですか? > はい、不明です そういうことですと、チュートリアルの最初から、チュートリアルと完全に同じコードでゼロから作り直してもらう方がはやそうです。 ・・・が、その前にやってみてもよさそうなことを後で回答欄に書いておきます。今 PC を使える環境にないので、しばしお待ちください。
yayaya22

2022/08/29 05:22

再度 Migration 操作をして DB の Price フィールドの型を decimal に変更しましたが、エラーが発生しました。 長々とすみません、ヒントをいただいたので、はじめから着実に進めてみます。ありがとうございました。 PM> Add-Migration Modified Build started... Build succeeded. Microsoft.EntityFrameworkCore.Infrastructure[10403] Entity Framework Core 6.0.8 initialized 'MvcMovieContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer:6.0.8' with options: None An operation was scaffolded that may result in the loss of data. Please review the migration for accuracy. To undo this action, use Remove-Migration. PM> Update-Database Build started... Build succeeded. Microsoft.EntityFrameworkCore.Infrastructure[10403] Entity Framework Core 6.0.8 initialized 'MvcMovieContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer:6.0.8' with options: None Microsoft.EntityFrameworkCore.Database.Command[20101] Executed DbCommand (18ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT 1 Microsoft.EntityFrameworkCore.Database.Command[20101] Executed DbCommand (14ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT OBJECT_ID(N'[__EFMigrationsHistory]'); Microsoft.EntityFrameworkCore.Database.Command[20101] Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT 1 Microsoft.EntityFrameworkCore.Database.Command[20101] Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT OBJECT_ID(N'[__EFMigrationsHistory]'); Microsoft.EntityFrameworkCore.Database.Command[20101] Executed DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT [MigrationId], [ProductVersion] FROM [__EFMigrationsHistory] ORDER BY [MigrationId]; Microsoft.EntityFrameworkCore.Migrations[20402] Applying migration '20220829050533_Modified'. Applying migration '20220829050533_Modified'. fail: Microsoft.EntityFrameworkCore.Database.Command[20102] Failed executing DbCommand (70ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] DECLARE @var0 sysname; SELECT @var0 = [d].[name] FROM [sys].[default_constraints] [d] INNER JOIN [sys].[columns] [c] ON [d].[parent_column_id] = [c].[column_id] AND [d].[parent_object_id] = [c].[object_id] WHERE ([d].[parent_object_id] = OBJECT_ID(N'[Movie]') AND [c].[name] = N'Price'); IF @var0 IS NOT NULL EXEC(N'ALTER TABLE [Movie] DROP CONSTRAINT [' + @var0 + '];'); ALTER TABLE [Movie] ALTER COLUMN [Price] decimal(18,2) NOT NULL; ALTER TABLE [Movie] ADD DEFAULT 0.0 FOR [Price]; Failed executing DbCommand (70ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] DECLARE @var0 sysname; SELECT @var0 = [d].[name] FROM [sys].[default_constraints] [d] INNER JOIN [sys].[columns] [c] ON [d].[parent_column_id] = [c].[column_id] AND [d].[parent_object_id] = [c].[object_id] WHERE ([d].[parent_object_id] = OBJECT_ID(N'[Movie]') AND [c].[name] = N'Price'); IF @var0 IS NOT NULL EXEC(N'ALTER TABLE [Movie] DROP CONSTRAINT [' + @var0 + '];'); ALTER TABLE [Movie] ALTER COLUMN [Price] decimal(18,2) NOT NULL; ALTER TABLE [Movie] ADD DEFAULT 0.0 FOR [Price]; Microsoft.Data.SqlClient.SqlException (0x80131904): Error converting data type nvarchar to numeric. The statement has been terminated. at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean isAsync, Int32 timeout, Boolean asyncWrite) at Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String methodName) at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues) at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration) at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action) ClientConnectionId:6a3b616c-986f-4ed7-8227-88d726901f70 Error Number:8114,State:5,Class:16 Error converting data type nvarchar to numeric. The statement has been terminated.
SurferOnWww

2022/08/29 23:54 編集

Price が nvarchar(max) に設定されていて、その後シードする際、 > 始めに Price = 7.99M にしていてエラーがでたので、(確か同じエラーdecimal)Price = "7.99M" のように文字列にして ・・・としたので、今回の Migration 操作前に DB の Price 列は "7.99M" というような文字列でシードされていたのでは? エラーメッセージを見ると、今回の Migration 操作で、シード済みの NULL 可の nvarchar(max) のデータを、NULL 不可の decimal 型に変えようとして失敗しているように見えます。 もし、原因を追及したいのなら、結果の DB がどうなっているか調べて、対処方法を考えてみてはいかがですか? ゼロからやり直した方が解決は早そうな気はしますので、原因追及に興味がないのであればお勧めはしませんが。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。