programing

데이터가 Null입니다.이 메서드 또는 속성은 Null 값에 대해 호출할 수 없습니다.

powerit 2023. 5. 18. 21:31
반응형

데이터가 Null입니다.이 메서드 또는 속성은 Null 값에 대해 호출할 수 없습니다.

저는 데이터베이스에서 영화에 대한 정보를 얻을 수 있을 뿐만 아니라 영화를 추가, 업데이트 및 삭제할 수 있는 애플리케이션을 개발하고 있습니다.데이터베이스에는 세 개의 테이블이 있습니다(Movie, 장르 및 MovieGener <- 영화 및 해당 장르 저장).한 가지를 제외하고는 모든 것이 잘 작동하고, 그것은 영화에 어떤 장르가 없을 때입니다(가능해야 합니다.

이 문제는 아래 방법에서 발생하며 Data is Null 예외가 발생합니다. 이 메서드 또는 속성은 Null 값에 대해 호출할 수 없습니다.

이유(물론)는 영화에 장르가 없기 때문에 저장 프로시저가 null을 반환하지만, 이 예외가 발생하는 것을 방지하는 방법을 찾을 수 없습니다.말씀드린 것처럼 장르/s 정보를 전혀 저장하지 않고 영화를 저장할 수 있어야 합니다.

방법:

public List<MovieGenre> GetMovieGenrebyMovieID(int movieID) {

    using (SqlConnection conn = CreateConnection()) {
        try {

            SqlCommand cmd = new SqlCommand("dbo.usp_GetMovieGenreByMovieID", conn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@MovieID", movieID);

            List<MovieGenre> movieGenre = new List<MovieGenre>(10);

            conn.Open();

            using (SqlDataReader reader = cmd.ExecuteReader()) {

                int movieGenreIDIndex = reader.GetOrdinal("MovieGenreID");
                int movieIDIndex = reader.GetOrdinal("MovieID");
                int genreIDIndex = reader.GetOrdinal("GenreID");

                while (reader.Read()) {

                    movieGenre.Add(new MovieGenre {
                        MovieID = reader.GetInt32(movieIDIndex),
                        MovieGenreID = reader.GetInt32(movieGenreIDIndex),
                        GenreID = reader.GetInt32(genreIDIndex)
                    });
                }
            }

            movieGenre.TrimExcess();

            return movieGenre;
        }
        catch {
            throw new ApplicationException();
        }
    }
}

저장 공간:

ALTER PROCEDURE usp_GetMovieGenreByMovieID
@MovieID int
AS
BEGIN
    BEGIN TRY
        SELECT m.MovieID, g.GenreID, mg.MovieGenreID, g.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를 사용하여 . 따라서 MovieGener 인스턴스를 만들기 전에 다음을 사용하여 null 가능 필드를 확인해야 합니다.SqlDataReader.IsDBNull방법:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull.aspx

장르를 가정하면ID 및 동영상 장르ID는 다음과 같은 작업을 수행할 수 있는 null입니다.

movieGenre.Add(new MovieGenre {
  MovieID = reader.GetInt32(movieIDIndex),
  MovieGenreID = reader.IsDBNull(movieGenreIDIndex) ? null : reader.GetInt32(movieGenreIDIndex),
  GenreID = reader.IsDBNull(genreIDIndex) ? null : reader.GetInt32(genreIDIndex)
});

이 오류는 내 Entity Framework Core 3.1 프로젝트에서 C#8 nullable 기능을 사용하도록 설정한 직후에 발생합니다.

해결책은 엔티티 속성을 null 가능한 속성으로 변경하는 것입니다.예를들면,

변경 위치:

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
}

저의 경우 EF Core를 사용하고 있었는데 문제는 필드가 데이터베이스에서 null일 수 있지만 Model Create에서는 다음과 같이 요구되었습니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   modelBuilder.Entity<MyEntity>(entity =>
   {
      entity.Property(e => e.Details)
                    .IsRequired()
                    .HasMaxLength(250);
   }
}

IsRequired()를 제거하면 정상적으로 작동합니다.

며칠 후 업데이트, 동일한 문제가 발생했습니다, 문자열 필드 DB에서 null을 허용하지 않았습니다.

null 문제를 처리하려면 다음과 같이 선택 문을 편집합니다.

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...

오래된 문제라는 것은 알지만 .net 6의 EF Core에서 이 문제가 발생했습니다.

문자열이 null이고 Entity Framework가 문자열 유형을 사용하여 기존 테이블에서 내 개체를 만들더라도 내 문자열 열의 유형을 문자열로 변경해야 합니까?데이터가 null인 데이터를 풀백하려면 를 입력합니다.

틀렸습니다:

public string Decision { get; set; }

정답:

public string? Decision { get; set; }

저는 제가 의존성 주사에 문제가 있다고 생각했습니다.알고 보니 엔터티 프레임워크 코어였고 간단한 해결책이었습니다.

.net5 data first project에서 이 문제가 발생했습니다. 데이터베이스의 필드가 null이지만 c# 엔티티 클래스가 필요했기 때문입니다. Efcore 파워 툴 확장으로 엔티티를 다시 생성한 후 문제가 해결되었습니다.

가장 간단한 대답은 null을 null이 아닌 값으로 바꾸는 것입니다.시도:

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

누군가가 이 문제에 직면했다면, 여기 제 경우가 있습니다.

저는 WEB API를 만들고 있습니다.[필수] 특성 - https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.requiredattribute?view=net-5.0, 을 배치하기 전에 데이터베이스에 NULL 값이 몇 개 있었습니다.그런 다음 이 속성을 모델에 추가하고 GET 요청을 시도했지만 "시스템"이었습니다.잘못된 작업예외: 데이터가 순서 1에서 NULL입니다. NULL 값에 대해 이 메서드를 호출할 수 없습니다. 호출하기 전에 IsDBNull을 사용하여 확인하십시오."라는 메시지가 나타납니다.

그래서 나는 데이터베이스에서 NULL 값을 삭제했고 그 이후 모든 요청이 정상적으로 작동했습니다.[Required] 속성이 적용되는 동안 EF Core가 데이터베이스에서 NULL 값을 허용하지 않아 오류가 발생하는 것으로 알고 있습니다.

누군가에게 도움이 되기를 바랍니다.

오늘 저는 이 문제에 직면했습니다.하지만 제 것은 다른 방식으로 고쳐졌습니다.언젠가 누군가가 비틀거리면 답은 그들을 위한 것입니다.

일반적인 C#.NET CLI 예외입니다.

기본값이 없는 새 외부 키를 DB 테이블 중 하나에 추가했습니다.따라서 값은 다음과 같이 설정되었습니다.NULL해당 열이 null을 허용하도록 설정되었기 때문입니다.그리고 저는 그 표에 대한 질문을 하는 동안 이 예외를 받아왔습니다.

해결책으로, 저는 그것을 교체했습니다.NULL적절한 값을 가진 값(외부 키이므로 적절해야 함).

이상입니다.

감사해요.

데이터베이스에 NULL 값을 가진 'XYZ' 열이 있지만 이 열에 매핑된 모델의 속성(bool)이 null이 아니기 때문에 이러한 현상이 발생했습니다.

나도 이런 문제가 있었고, 나에게 우리 반의 재산은 다음과 같이 꾸며졌습니다.[Required]테이블에 해당 열에 null 값이 있습니다.일리가 있습니다.Required(필수)를 제거하면 데이터가 null 값으로 로드되었습니다.

예약 수량 - DB에 null 값이 있지만 실제 DB 예약 수량이 null이 아닌 열입니다.어떤 드문 경우에 그것은 우연히 들어갑니다.아래와 같은 경우 코드 스로우 오류가 발생합니다(Data는 Null입니다). 이 메서드 또는 속성은 Null 값에 대해 호출할 수 없습니다.

totalBookingQuantity += item.InspPoTransactions.Where(x => x.PoId == inspectionPODetail.PoId && x.ProductId == inspectionPODetail.ProductId).Sum(x => Convert.ToInt32(x.BookingQuantity));

이 오류는 데이터베이스에 대한 사용자의 권한 부족으로 인해 발생할 수 있습니다.사용자에게 데이터베이스 실행, 선택 또는 표시 권한이 있는지 확인합니다.

언급URL : https://stackoverflow.com/questions/9719683/data-is-null-this-method-or-property-cannot-be-called-on-null-values

반응형