如何解决字符串上可为null的C#SqlNull异常?
我得到这个错误: System.Data.SqlTypes.SqlNullValueException:数据为空。无法对空值调用此方法或属性 位于Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull()如何解决字符串上可为null的C#SqlNull异常?,c#,.net,C#,.net,我得到这个错误: System.Data.SqlTypes.SqlNullValueException:数据为空。无法对空值调用此方法或属性 位于Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull() 在Microsoft.Data.SqlClient.SqlBuffer.get_String() 位于Microsoft.Data.SqlClient.SqlDataReader.GetString(Int32 i) 在lambda_方法11(闭包、Que
在Microsoft.Data.SqlClient.SqlBuffer.get_String()
位于Microsoft.Data.SqlClient.SqlDataReader.GetString(Int32 i)
在lambda_方法11(闭包、QueryContext、DbDataReader、ResultContext、SingleQueryResultCoordinator)
位于System.Collections.Generic.List的Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryEnumerable
1.Enumerator.MoveNext(),位于System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)的
位于D:\Punya Ricky\Works\Insosys\Local\API for report\ReportCrewApi\Services\ViewMastereIsAktifServices.GetMastereIsAktifs()中的ReportCrewApi.Services.ViewMastereIsAktifServices.GetMastereIsAktifs():第26行
我以前尝试过使用string?
,但是当我看这个时,对于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),>)
在检查文档之前,我已经尝试了使用#null-able-enable
,公共字符串的所有操作?属性{get;set}=null
,我在其他问题中用谷歌搜索过它(实际上是在这里),但它们都说相同的,没有使用string?
,当它说我的字符串为null时,错误指向我的服务
ViewMastereIsAktifServices.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;
}
}
public类ViewMastereIsAktifServices:IViewMastereIsAktifServices
{
私有EFRMContext\u efrm\u上下文;
私有库存上下文_库存上下文;
公共ViewMastereIsAktifServices(EFRMContext EFRMContext,INVENTORYContext INVENTORYContext)
{
_库存上下文=库存上下文;
_efrm_context=eFRMContext;
}
公共IEnumerable GetMastereIsAktifs()
{
//这是第26行
var mstIsaktif=_inventory_context.view_mastereisaktif.OrderByDescending(x=>x.NIK.ToList();
返回mstIsaktif;
}
}
我真的怀疑问题出在模型上,因为我得到了模型上的警告
退出构造函数时,不可为null的属性“LokasiKerja”必须包含非null值。考虑将属性声明为可空的。< /P>
该属性之后的每个字符串都给了我相同的警告(我不明白为什么当属性
Jabatan
不存在时字符串会收到这些警告),这就是为什么当我试图运行get-my data on postman时,它给了我错误(在上面最上面),我已经在这一点上停留了6个小时。如何解决这个问题?当模型希望列是必需的时,会发生此错误,即使错误消息专门讨论可空性。这两个概念虽然相关,但在本例中是不同的
请从模型中删除对#nullable enable
的多个调用,这是一个编译器指令,在其余代码中是开的或关的,您不断地将其设置为开的,但在这种情况下,我们实际上并不争论该值的可空性,默认情况下,字符串可以为null,并且在这种上下文中可以正常工作
问题是,哪种模式。。。您没有这样标记它,但它看起来像一个OData服务实现(您也提到了postman)
在本例中,似乎OData模型是罪魁祸首,在该模型中,我怀疑您的字段标记为必需
为了证明这一点,请找到EdmModel builder脚本并删除LokasiKerja
字段的任何必需的声明,或者您可以将其放在builder配置的末尾:
modelBuilder.Entity<ViewMastereIsAktif>()
.Property(x => x.LokasiKerja).IsRequired(false);
modelBuilder.Entity()
.Property(x=>x.LokasiKerja).IsRequired(false);
现在,当您请求数据馈送时,如果是Required状态导致了问题,那么错误消息将被解决,或者将引用下一个Required但为null的列
显示此实体的流畅配置也可能有助于解决此问题
快速搜索SO可找到此解决方案,这也可能有助于:
FYI错误堆栈将我们指向SQL的原因是由于LINQ延迟逻辑和OData对实际执行和反序列化的SQL施加的投影
您使用的框架版本是什么?您的意思是返回IEnumerable
?这是一种阻塞模式,取决于您的用例。调用.ToList()
每次都会加载该表中的所有内容。感谢您的回复,我的第26行上仍然有一个null指向,错误与上面相同,即使我删除了可为null的启用,并创建了edmmodel builder。我是否应该在model builder上将每个字段都转换为IsRequired false?如果您有一个约定使所有必需的内容都能正常工作,那么您可以尝试一下,不过,尝试并追踪这些内容的来源也会很好。我想你应该尽一切努力,看看这是否能解决问题
modelBuilder.Entity<ViewMastereIsAktif>()
.Property(x => x.LokasiKerja).IsRequired(false);