我正在尝试从 C# 调用 sql 存储过程。我有以下代码来创建 DataColumn。但是在添加可为空的 Guid 和 DateTime 类型时创建 DataTable 时出现错误。
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]
{
new DataColumn(nameof(LearnerEntity.FirstName), typeof(string)),
new DataColumn(nameof(LearnerEntity.DateOfBirth), typeof(DateTime?)),
new DataColumn(nameof(LearnerEmployerEntity.SectorId), typeof(Guid?)),
new DataColumn(nameof(LearnerEntity.EPortfolioId), typeof(int?))
});
dt.Rows.Add(
learnerEntity.FirstName,
learnerEntity.DateOfBirth ?? SqlDateTime.Null,
learnerEntity.Employer?.SectorId ?? SqlGuid.Null.Value,
learnerEntity.EPortfolioId ?? SqlInt32.Null.Value);
Run Code Online (Sandbox Code Playgroud)
错误是:
DataSet does not support System.Nullable<>.
Run Code Online (Sandbox Code Playgroud)
谁能帮助我我在这里做错了什么?
我正在尝试以下操作:
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]
{
new DataColumn(nameof(LearnerEntity.FirstName), typeof(string)),
new DataColumn(nameof(LearnerEntity.DateOfBirth), Nullable.GetUnderlyingType(typeof(LearnerEmployerEntity).GetProperty("DateOfBirth").PropertyType)),
new DataColumn(nameof(LearnerEmployerEntity.SectorId), Nullable.GetUnderlyingType(typeof(LearnerEmployerEntity).GetProperty("SectorId").PropertyType)),
new DataColumn(nameof(LearnerEntity.EPortfolioId), Nullable.GetUnderlyingType(typeof(LearnerEmployerEntity).GetProperty("EPortfolioId").PropertyType))
});
dt.Rows.Add(
learnerEntity.FirstName,
learnerEntity.DateOfBirth ?? SqlDateTime.Null,
learnerEntity.Employer?.SectorId ?? SqlGuid.Null.Value,
learnerEntity.EPortfolioId ?? SqlInt32.Null.Value);
Run Code Online (Sandbox Code Playgroud)
谢谢
您必须使用 来初始化它DBNull.Value。但是,由于可空类型之间没有隐式转换,因此您将生成丑陋的代码。最好使用SetField支持可为空的扩展方法:
DataRow row = dt.Rows.Add();
row.SetField<string>(nameof(LearnerEntity.FirstName), LearnerEntity.FirstName);
row.SetField<DateTime?>(nameof(LearnerEntity.DateOfBirth), LearnerEntity.DateOfBirth);
row.SetField<Guid?>(nameof(LearnerEmployerEntity.SectorId), learnerEntity.Employer?.SectorId);
row.SetField<int?>(nameof(LearnerEntity.EPortfolioId), LearnerEntity.EPortfolioId);
Run Code Online (Sandbox Code Playgroud)