首页 > 解决方案 > 值不能为空。(参数'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;
        }

标签: c#sql-serverexcelentity-frameworkasp.net-core

解决方案


您可以将属性的空值“转换”为字符串。示例: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,...) {}

添加 '?' 使属性能够接受空值,如果数据库中的列可以接受空值,它必须工作。


推荐阅读