C# 数据为空。无法对空值调用此方法或属性

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,

我正在开发一个应用程序,可以从数据库中获取有关电影的信息,还可以添加、更新和删除电影。在数据库中,我有三个表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,'') 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);
   }
}