c# - 如何解决字符串上可为空的 C# SqlNull 异常?
问题描述
我收到此错误:
System.Data.SqlTypes.SqlNullValueException:数据为空。不能对 Null 值调用此方法或属性。
在 Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull()
在 Microsoft.Data.SqlClient.SqlBuffer.get_String()
在 Microsoft.Data.SqlClient.SqlDataReader.GetString(Int32 i)
在 lambda_method11(Closure , QueryContext , DbDataReader , ResultContext , SingleQueryResultCoordinator )
在 Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable1.Enumerator.MoveNext() at System.Collections.Generic.List
1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 源)
在 D:\Punya Ricky\Works\Insosys\Local\API for report\ReportCrewAPI\Services 中的 ReportCrewApi.Services.ViewMastereIsAktifServices.GetMastereIsAktifs() \ViewMastereIsAktifServices.cs:第 26 行
我之前尝试过使用string?
,但是当我查看这个文档时,对于字符串,引用将是可空的,所以我没有使用它。但我不断收到同样的错误。我已经查看了我在数据库中的数据
数据库表中的列:
(<NIK, varchar(10),>
,<NIK_lama, varchar(10),>
,<Nama, varchar(100),>
,<KodeOrganisasi, varchar(20),>
,<Unit, varchar(255),>
,<Jabatan, varchar(50),>
,<KodeLokasi, int,>
,<LokasiKerja, varchar(100),>
,<KodeManajemen, int,>
,<ManajemenLevel, varchar(30),>
,<TanggalMasuk, datetime,>
,<TanggalDiangkat, datetime,>
,<KodeStatus, int,>
,<StatusHubunganKerja, varchar(100),>
,<TanggalLahir, datetime,>
,<BulanLahir, int,>
,<KodeKelamin, int,>
,<JenisKelamin, varchar(20),>
,<KodePerkawinan, int,>
,<StatusPerkawinan, varchar(100),>
,<KodePerumahan, int,>
,<StatusPerumahan, varchar(100),>
,<Owner, char(1),>
,<JumlahAnak, int,>
,<Kp, varchar(50),>
,<Ko, varchar(20),>
,<umur, int,>
,<TahunMasaKerja, smallint,>
,<BulanMasaKerja, smallint,>
,<KodeAgama, int,>
,<Agama, varchar(100),>
,<TempatLahir, varchar(25),>
,<KodeDarah, int,>
,<Darah, varchar(100),>
,<Alamat, varchar(100),>
,<SekolahK, varchar(200),>
,<LokasiK, varchar(200),>
,<JurusanK, varchar(200),>
,<TahunK, int,>
,<IPK, float,>
,<KodePendidikan, int,>
,<Pendidikan, varchar(100),>
,<KodeTransportasi, int,>
,<Transportasi, varchar(100),>
,<CountHobi, int,>
,<CountBahasa, int,>
,<LokasiAbsen, varchar(4),>
,<NomorHP, varchar(25),>
,<GolonganHP, varchar(5),>
,<NoKTP, varchar(40),>
,<NoAstek, varchar(25),>
,<NoBPJSKesehatan, varchar(50),>
,<Passport, varchar(20),>
,<Initial, varchar(15),>
,<KepesertaanPensiun, tinyint,>
,<BebanKp, varchar(20),>
,<BebanKo, char(1),>
,<BebanUnit, varchar(255),>
,<NamaPasangan, varchar(50),>
,<TanggalLahirPasangan, int,>
,<UmurPasangan, int,>
,<AlamatKTP, varchar(100),>
,<TanggalAwalPerjanjian, datetime,>
,<TanggalAkhirPerjanjian, datetime,>
,<RecentTglAwalPerjanjian, datetime,>
,<RecentTglAkhirPerjanjian, datetime,>
,<RecentTglMulaiMutasi, datetime,>
,<RecentTglSelesaiMutasi, datetime,>
,<TanggalPHK, datetime,>
,<BulanPHK, int,>
,<NoPolisi, varchar(25),>
,<Telepon, varchar(25),>
,<NPWP, varchar(50),>
,<SIM, varchar(20),>
,<KodePos, varchar(6),>
,<ExtensionTelpon, varchar(25),>
,<KodePHK, int,>
,<KeteranganPHK, varchar(100),>
,<unit_cnn, varchar(300),>
,<posisi_cnn, varchar(300),>
,<tgl_mulai_cnn, nvarchar(10),>
,<tgl_selesai_cnn, nvarchar(10),>
,<no_sk_cnn, varchar(100),>
,<lokasi_kerja_cnn, varchar(100),>
,<NoAkun, int,>
,<KodeSukuUsaha, int,>
,<NamaSukuUsaha, int,>
,<email, varchar(200),>
,<UnitShortName, varchar(255),>
,<Hobby, varchar(255),>
,<rekening_nama, varchar(50),>
,<rekening_no, varchar(50),>
,<NamaAnak1, varchar(30),>
,<TanggalLahirAnak1, datetime,>
,<NamaAnak2, varchar(30),>
,<TanggalLahirAnak2, datetime,>
,<NamaAnak3, varchar(30),>
,<TanggalLahirAnak3, datetime,>
,<NamaAnak4, varchar(30),>
,<TanggalLahirAnak4, datetime,>
,<division_code, varchar(50),>
,<division_name, varchar(300),>
,<department_code, varchar(50),>
,<department_name, varchar(300),>
,<kode_divisi_statistik, tinyint,>
,<nama_divisi_statistik, varchar(30),>
,<kode_sts_kry_statistik, smallint,>
,<nama_sts_kry_statistik, varchar(50),>
,<directorate_code, varchar(50),>
,<directorate_name, varchar(300),>)
我试图比较我的数据模型,但没有什么不同。
这是我的模型类:
public class ViewMastereIsAktif
{
[Key]
[StringLength(10)]
public string NIK { get; set; }
[StringLength(10)]
public string NIK_lama {get; set;}
[StringLength(100)]
public string Nama { get; set; }
[StringLength(20)]
public string KodeOrganisasi { get; set; }
[StringLength(255)]
public string Unit { get; set; }
[StringLength(50)]
public string Jabatan { get; set; }
#nullable enable
public int? KodeLokasi { get; set; }
[StringLength(100)]
public string LokasiKerja { get; set; }
#nullable enable
public int? KodeManajemen { get; set; }
[StringLength(30)]
public string ManajemenLevel { get; set; }
#nullable enable
public DateTime? TanggalMasuk { get; set; }
#nullable enable
public DateTime? TanggalDiangkat { get; set; }
#nullable enable
public int? KodeStatus { get; set; }
[StringLength(100)]
public string StatusHubunganKerja { get; set; }
#nullable enable
public DateTime? TanggalLahir { get; set; }
#nullable enable
public int? BulanLahir { get; set; }
#nullable enable
public int? KodeKelamin { get; set; }
[StringLength(20)]
public string JenisKelamin { get; set; }
#nullable enable
public int? KodePerkawinan { get; set; }
[StringLength(100)]
public string StatusPerkawinan { get; set; }
#nullable enable
public int? KodePerumahan { get; set; }
[StringLength(100)]
public string StatusPerumahan { get; set; }
#nullable enable
public char Owner { get; set; }
#nullable enable
public int? JumlahAnak { get; set; }
[StringLength(50)]
public string Kp { get; set; }
[StringLength(20)]
public string Ko { get; set; }
#nullable enable
public int? umur { get; set; }
#nullable enable
public Int16 TahunMasaKerja { get; set; }
#nullable enable
public Int16 BulanMasaKerja { get; set; }
#nullable enable
public int? KodeAgama { get; set; }
[StringLength(100)]
public string Agama { get; set; }
[StringLength(25)]
public string TempatLahir { get; set; }
#nullable enable
public int? KodeDarah { get; set; }
[StringLength(100)]
public string Darah { get; set; }
[StringLength(100)]
public string Alamat { get; set; }
[StringLength(200)]
public string SekolahK { get; set; }
[StringLength(200)]
public string LokasiK { get; set; }
[StringLength(200)]
public string JurusanK { get; set; }
#nullable enable
public int? TahunK { get; set; }
#nullable enable
public float IPK { get; set; }
#nullable enable
public int? KodePendidikan { get; set; }
[StringLength(100)]
public string Pendidikan { get; set; }
#nullable enable
public int? KodeTransportasi { get; set; }
[StringLength(100)]
public string Transportasi { get; set; }
#nullable enable
public int? CountHobi { get; set; }
#nullable enable
public int? CountBahasa { get; set; }
[StringLength(4)]
public string LokasiAbsen { get; set; }
[StringLength(25)]
public string NomorHP { get; set; }
[StringLength(5)]
public string GolonganHP { get; set; }
[StringLength(40)]
public string NoKTP { get; set; }
[StringLength(25)]
public string NoAstek { get; set; }
[StringLength(50)]
public string NoBPJSKesehatan { get; set; }
[StringLength(20)]
public string Passport { get; set; }
[StringLength(15)]
public string Initial { get; set; }
#nullable enable
public Byte? KepesertaanPensiun { get; set; }
[StringLength(20)]
public string BebanKp { get; set; }
#nullable enable
public char BebanKo { get; set; }
[StringLength(255)]
public string BebanUnit { get; set; }
[StringLength(50)]
public string NamaPasangan { get; set; }
#nullable enable
public int? TanggalLahirPasangan { get; set; }
#nullable enable
public int? UmurPasangan { get; set; }
[StringLength(100)]
public string AlamatKTP { get; set; }
#nullable enable
public DateTime? TanggalAwalPerjanjian { get; set; }
#nullable enable
public DateTime? TanggalAkhirPerjanjian { get; set; }
#nullable enable
public DateTime? RecentTglAwalPerjanjian { get; set; }
#nullable enable
public DateTime? RecentTglAkhirPerjanjian { get; set; }
#nullable enable
public DateTime? RecentTglMulaiMutasi { get; set; }
#nullable enable
public DateTime? RecentTglSelesaiMutasi { get; set; }
#nullable enable
public DateTime? TanggalPHK { get; set; }
#nullable enable
public int? BulanPHK { get; set; }
[StringLength(25)]
public string NoPolisi { get; set; }
[StringLength(25)]
public string Telepon { get; set; }
[StringLength(50)]
public string NPWP { get; set; }
[StringLength(20)]
public string SIM { get; set; }
[StringLength(6)]
public string KodePos { get; set; }
[StringLength(25)]
public string ExtensionTelpon { get; set; }
#nullable enable
public int? KodePHK { get; set; }
[StringLength(100)]
public string KeteranganPHK { get; set; }
[StringLength(300)]
public string unit_cnn { get; set; }
[StringLength(300)]
public string posisi_cnn { get; set; }
[StringLength(10)]
public string tgl_mulai_cnn { get; set; }
[StringLength(10)]
public string tgl_selesai_cnn { get; set; }
[StringLength(100)]
public string no_sk_cnn { get; set; }
[StringLength(100)]
public string lokasi_kerja_cnn { get; set; }
#nullable enable
public int? NoAkun { get; set; }
#nullable enable
public int? KodeSukuUsaha { get; set; }
#nullable enable
public int? NamaSukuUsaha { get; set; }
[StringLength(200)]
public string email { get; set; }
[StringLength(255)]
public string UnitShortName { get; set; }
[StringLength(255)]
public string Hobby { get; set; }
[StringLength(50)]
public string rekening_nama { get; set; }
[StringLength(50)]
public string rekening_no { get; set; }
[StringLength(30)]
public string NamaAnak1 { get; set; }
#nullable enable
public DateTime? TanggalLahirAnak1 { get; set; }
[StringLength(30)]
public string NamaAnak2 { get; set; }
#nullable enable
public DateTime? TanggalLahirAnak2 { get; set; }
[StringLength(30)]
public string NamaAnak3 { get; set; }
#nullable enable
public DateTime? TanggalLahirAnak3 { get; set; }
[StringLength(30)]
public string NamaAnak4 { get; set; }
#nullable enable
public DateTime? TanggalLahirAnak4 { get; set; }
[StringLength(50)]
public string division_code { get; set; }
[StringLength(300)]
public string division_name { get; set; }
[StringLength(50)]
public string department_code { get; set; }
[StringLength(300)]
public string department_name { get; set; }
#nullable enable
public Byte? kode_divisi_statistik { get; set; }
[StringLength(30)]
public string nama_divisi_statistik { get; set; }
#nullable enable
public Int16 kode_sts_kry_statistik { get; set; }
[StringLength(50)]
public string nama_sts_kry_statistik { get; set; }
[StringLength(50)]
public string directorate_code { get; set; }
[StringLength(300)]
public string directorate_name { get; set; }
}
在我检查文档之前,我已经尝试了所有 using #nullable enable
,public string? Property {get; set} = null
并且我一直在其他问题中搜索它(实际上是这里),但他们都说没有 using string?
,当它说我的字符串时,错误指向我的服务无效的
查看MastereIsAktifServices.cs
public class ViewMastereIsAktifServices : IViewMastereIsAktifServices
{
private EFRMContext _efrm_context;
private INVENTORYContext _inventory_context;
public ViewMastereIsAktifServices(EFRMContext eFRMContext, INVENTORYContext iNVENTORYContext)
{
_inventory_context = iNVENTORYContext;
_efrm_context = eFRMContext;
}
public IEnumerable<ViewMastereIsAktif> GetMastereIsAktifs()
{
//here is line 26
var mstIsaktif = _inventory_context.view_mastereisaktif.OrderByDescending(x => x.NIK).ToList();
return mstIsaktif;
}
}
我真的怀疑问题出在模型上,因为我收到了模型上的警告,也就是说
退出构造函数时,不可为空的属性“LokasiKerja”必须包含非空值。考虑将属性声明为可为空。
并且该属性之后的每个字符串都给我相同的警告(我不明白为什么字符串在属性Jabatan
不存在时会收到这些警告),这就是为什么当我尝试在邮递员上运行获取我的数据时它给了我错误(在非常上面),我已经在这一点上停留了 6 个小时。我该如何解决?
解决方案
当模型期望该列为Required时,会发生此错误,即使错误消息专门讨论了可空性,这两个概念虽然相关,但在这种情况下是不同的。
请
#nullable enable
从模型中删除对的多个调用,这是一个编译器指令,对于其余代码而言,它要么打开要么关闭,您不断将其设置为ON,但在这种情况下,我们实际上并没有争论可空性值,默认情况下字符串可以为空,并且在这种情况下可以正常工作。
问题是,哪个模型......你没有这样标记它,但它看起来像一个 OData 服务实现(你也提到了邮递员)
在这种情况下,似乎OData 模型是罪魁祸首,在该模型中,我怀疑您的字段被标记为Required。
为了证明这一点,找到您的 EdmModel 构建器脚本并删除该字段的任何Required
声明LokasiKerja
,或者您可以将其放在构建器流式配置的末尾:
modelBuilder.Entity<ViewMastereIsAktif>()
.Property(x => x.LokasiKerja).IsRequired(false);
现在,当您请求数据馈送时,如果是“必需”状态导致问题,则错误消息将被解决,或者将引用下一个必需但为空的列。
显示此实体的流畅配置也可能有助于解决问题。
快速搜索 SO 发现此解决方案也可能有所帮助:https ://stackoverflow.com/a/64001223/1690217
仅供参考,错误堆栈将我们指向 SQL 的原因是由于 LINQ 延迟逻辑和 OData 对执行和反序列化的实际 SQL 施加的投影。