C# 数据为空。无法对空值调用此方法或属性
我正在开发一个应用程序,可以从数据库中获取有关电影的信息,还可以添加、更新和删除电影。在数据库中,我有三个表Movie、Genre和MovieGenre按如下方式编辑select语句以处理空问题C# 数据为空。无法对空值调用此方法或属性,c#,asp.net,sql,stored-procedures,C#,Asp.net,Sql,Stored Procedures,我正在开发一个应用程序,可以从数据库中获取有关电影的信息,还可以添加、更新和删除电影。在数据库中,我有三个表Movie、Genre和MovieGenre按如下方式编辑select语句以处理空问题 SELECT ISNULL(m.MovieID,0) AS MovieID, ISNULL(g.GenreID,0) AS GenreID, ISNULL(mg.MovieGenreID,0) AS MovieGenreID, ISNULL(g.Genre,
SELECT ISNULL(m.MovieID,0) AS MovieID,
ISNULL(g.GenreID,0) AS GenreID,
ISNULL(mg.MovieGenreID,0) AS MovieGenreID,
ISNULL(g.Genre,'') AS Genre
FROM --rest of your query...
最简单的答案是用非空值替换空值。尝试:
ALTER PROCEDURE usp_GetMovieGenreByMovieID
@MovieID int
AS
BEGIN
BEGIN TRY
SELECT m.MovieID,
coalesce(g.GenreID,0) GenreID,
coalesce(mg.MovieGenreID,0) MovieGenreID,
coalesce(g.Genre, 'Not Applicable') Genre
FROM Movie AS m
LEFT JOIN MovieGenre AS mg
ON m.MovieId = mg.MovieID
LEFT JOIN Genre AS g
ON mg.GenreID = g.GenreID
WHERE m.MovieID = @MovieID
END TRY
BEGIN CATCH
RAISERROR ('Error while trying to receive genre(s).',16,1)
END CATCH
END
您不应该尝试将proc中的null值转换为ints-因此,在创建MovieGene实例之前,您需要使用SqlDataReader.IsDBNull方法检查可为null的字段: 假设GenreID和MovieGenreID是可为null的int,则可以执行以下操作:
movieGenre.Add(new MovieGenre {
MovieID = reader.GetInt32(movieIDIndex),
MovieGenreID = reader.IsDBNull(movieGenreIDIndex) ? null : reader.GetInt32(movieGenreIDIndex),
GenreID = reader.IsDBNull(genreIDIndex) ? null : reader.GetInt32(genreIDIndex)
});
BookingQuantity—以DB为单位具有空值的列。但实际DB BookingQuantity不为空列。一些罕见的情况下,它碰巧进入。在下面代码抛出错误的情况下,相同的errorData为Null。无法对空值调用此方法或属性
totalBookingQuantity+=item.InspPoTransactions.Wherex=>x.PoId==inspectionPODetail.PoId&&x.ProductId==inspectionPODetail.ProductId.Sumx=>Convert.ToInt32x.BookingQuantity 在我的EntityFrameworkCore3.1项目中启用了C8可空特性后,此错误立即发生 解决方案是将实体属性更改为可为空的对应项。比如说, 更改为:
public class Person {
public int Id { get; set; }
public string Name { get;set; }
public string Address { get;set; }
}
致:
在我的例子中,我使用的是EF Core,问题是该字段在数据库中是可以为空的,但在ModelCreating中需要这样做:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>(entity =>
{
entity.Property(e => e.Details)
.IsRequired()
.HasMaxLength(250);
}
}
我移除了所需的ISR,它工作正常
几天后更新,
遇到了同样的问题,一个字符串字段在数据库中不允许null。今天我遇到了这个问题。但我的已经用另一种方式修复了。如果有一天有人绊倒了,答案就是他们 因为这是一个通用的C.NET CLI异常 我在一个DB表中添加了一个新的外键,没有默认值。因此,该值被设置为null,因为该列被设置为允许null。 我在查询表时遇到了这个异常 作为解决方案,我将空值替换为适当的值,因为它们是外键“它们应该是适当的” 就这些
谢谢。这个:catch{throw new ApplicationException;}是个非常糟糕的主意。您正在丢失所有上下文信息。至少将捕获的异常作为内部异常传递:catchException ex{throw new ApplicationExceptionex;}感谢您的回答。我尝试了你的代码,但不幸的是,我得到了相同的错误:/I我只对GenreID和Genre列使用ISNULL来显示你。您可以将其用于每一列,作为更新的答案,以包括所有列1+,用于coalesce ISNULL不适用于我我使用MySQL您可能需要将代码添加为reader.IsDBNullmovieGenreIDIndex?int?null:reader.GetInt32MovieGenReidIndex如何找出发生错误的属性?字符串可为null。@Jocie我指的是新的C 8可为null的引用类型,这里的string可以是string,也可以是string?在我的回答中,我用了粗体字来让它更清晰。这很有趣,我想知道为什么当字符串已经可以为空时,您需要这样做。不过这是个好发现。
public class Person {
public int Id { get; set; }
public string Name { get;set; }
public string Address { get;set; }
}
public class Person {
public int Id { get; set; }
public string Name { get;set; }
public string? Address { get;set; } //change address to nullable string since it is nullable in database
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>(entity =>
{
entity.Property(e => e.Details)
.IsRequired()
.HasMaxLength(250);
}
}