c# - 值不能为空。(参数's')尝试将excel文件上传到数据库时
问题描述
我正在参加将 excel 值上传并保存到数据库中。在将值保存到 db 时出现错误Value cannot be null. (Parameter 's')
,我猜测问题可能与 EF 有关,但我仍然无法确定如何修复它。
如果excel没有空列,则excel将成功上传并保存到db。但是如果某些excel列是空的,我该如何处理?
有些列可以让我清空,这就是为什么我必须使一些可以为空。
我不知道我做错了什么
ex.StackTrace:
at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at System.Int64.Parse(String s)
at LoanWarehouse.Controllers.AccountUploadController.<SaveCustomerUpload>d__14.MoveNext() in C:\Users\DELL\source....\Controllers\UploadController.cs:line 409
这是提取值并保存到数据库的方法
public async Task<Response> SaveCustomerUpload(int UploadId, ExcelWorksheet workSheet, int rowSize)
{
Response response = new Response();
response.IsSuccessful = true;
List<Customer> CustomerDatalist = new List<Customer>();
//skip first row for column header
for (int i = 2; i <= rowSize; i++)
{
try
{
CustomerDatalist.Add(new Customer
{
CustId = long.Parse(workSheet.Cells[i, 1].Value.ToString()),
FirstName_CompanyName = workSheet.Cells[i, 2].Value.ToString(),
MiddleName = workSheet.Cells[i, 3].Value.ToString(),
Gender = workSheet?.Cells[i, 4]?.Value?.ToString(),
FatherName = workSheet?.Cells[i, 5]?.Value?.ToString(),
MotherName = workSheet?.Cells[i, 6]?.Value?.ToString(),
DateOfBirth = null,
BVN = long.Parse(workSheet?.Cells[i, 8]?.Value?.ToString()),
EmailAddress = workSheet?.Cells[i, 9]?.Value?.ToString(),
OfficeNumber = workSheet?.Cells[i, 10]?.Value?.ToString(),
Nationality = workSheet?.Cells[i, 11]?.Value?.ToString(),
PlaceOfBirth = workSheet?.Cells[i, 12]?.Value?.ToString(),
MaritalStatus = workSheet?.Cells[i, 13]?.Value?.ToString(),
SpouseName = workSheet?.Cells[i, 14]?.Value?.ToString(),
TelephoneNo = workSheet?.Cells[i, 15]?.Value?.ToString(),
MobileNo = workSheet?.Cells[i, 16]?.Value?.ToString(),
Address = workSheet?.Cells[i, 17]?.Value?.ToString(),
OfficeEmailAddress = workSheet?.Cells[i, 18]?.Value?.ToString(),
FaxNumber = workSheet?.Cells[i, 19]?.Value?.ToString(),
WebsiteURL = workSheet?.Cells[i, 20]?.Value?.ToString(),
RelatedComapany = workSheet?.Cells[i, 21]?.Value?.ToString(),
LegalConstitution = workSheet?.Cells[i, 22]?.Value?.ToString(),
ShareHolder = workSheet?.Cells[i, 22]?.Value?.ToString(),
}
);
}
catch (Exception ex)
{
response.Message = ex.ToString();
response.IsSuccessful = false;
logger.Error(ex);
break;
}
}
if (response.IsSuccessful)
{
//save the details for this upload
await _context.Customer.AddRangeAsync(CustomerDatalist);
await _context.SaveChangesAsync();
}
else
{
//reverse the initial AccountUpload and delete the details
var CustomerUpload = await _context.Customer.FindAsync(UploadId);
_context.Customer.Remove(CustomerUpload);
await _context.SaveChangesAsync();
}
return response;
}
解决方案
您可以将属性的空值“转换”为字符串。示例:CustId = long.Parse(workSheet.Cells[i, 1].Value.ToString()) ?? “”
编辑:对不起。这不起作用,因为它给 CustId 一个空字符串。但我认为这会奏效。首先,在“CustomerDatalist.Add”之外创建 2 个变量:
string _CustId = workSheet.Cells[i, 1].Value.ToString()
string _BVN = workSheet.Cells[i, 8].Value.ToString()
在“添加”方法中将它们各自的行更改为: CustId = (_CustId == "") ?(int?)null : long.Parse(_CustId), BVN = (_BVN == "") ?(int?)null : long.Parse(_CustId),
如果字符串为空,这将为属性分配空值。但它需要您更改“CustomerDatalist”类中的一些参数。添加 ?在属性和对象本身的定义中:
long ?CustId
long ?BVN
public CustomerDatalist(int ?CustId,... ?BVN,...) {}
添加 '?' 使属性能够接受空值,如果数据库中的列可以接受空值,它必须工作。
推荐阅读
- typescript - 是否可以在 TypeScript 中精确键入 _.invert?
- python - 如何将高斯噪声 (10%) 添加到一组数据点
- python - 正则表达式用斜杠比较两个字符串
- laravel - 如何将 updated_at 从时间戳类型更改为日期时间?
- assembly - 在 Mars 4.5 中初始化值出现错误
- coq - 如何在 Coq 中使用成员证明作为参数来实现删除?
- reactjs - 如何让 fontawesome 图标出现在导航栏中,就像在 react-bootstrap 文档中一样?
- excel - 按工作表索引将一个 Excel 工作表复制到第二个工作表
- android - 在 kotlin 中使用 retrofit2 恢复我在另一个类中的服务响应
- java - 如何获取模型中所有被覆盖的操作/属性?