Проблема и ошибка при вставке значений массива в хранимую процедуру EF в c # - PullRequest
0 голосов
/ 12 марта 2019

У меня возникла проблема при попытке вставить данные в хранимую процедуру из 5 переменных массива. Я получаю следующую ошибку System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index. ты видишь, что я здесь делаю не так? Переменные lotlist, netweightlist, grossweightlist и serialnumberlist могут содержать от 1 до многих данных, которые нужно вставить в мою хранимую процедуру.

метод, который создаст мою хранимую процедуру

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BarcodeReceivingApp.Persistence;
using BarcodeReceivingApp.Persistence.Repositories;

namespace BarcodeReceivingApp.Functionality
{
    public class StoredProcedureInsert
    {
        private readonly BarcodeReceivingFootPrintDbContext _barcodeReceivingFootPrintDbContext = new BarcodeReceivingFootPrintDbContext();

        public void CallManualBlindBarcodeParsingEventRequestFootPrintProcedure
        (
            decimal actualPackagedAmount, int actualPackagedPackId, string lotLookupCode,
            int warehouseId, int materialId, string vendorLotLookupCode, DateTime vendorLotManufactureDate, 
            DateTime vendorLotExpirationDate, int shipmentId, decimal netWeight, 
            decimal grossWeight, string serialLookupCode, string licensePlateLookupCode
        )
        {
            _barcodeReceivingFootPrintDbContext.Database
                .ExecuteSqlCommand
                ("EXEC noram_reporting.ManualBlindBarcodeParsingEventRequest " +
                 "@ActualPackagedAmount, @ActualPackagedPackId, @LotLookupCode, @WarehouseId, @MaterialId, @VendorLotLookupCode," +
                 "@VendorLotManufactureDate, @VendorLotExpirationDate, @ShipmentId, @netWeight, @grossWeight, @serialLookupCode, @licensePlateLookupCode",
      new SqlParameter("@ActualPackagedAmount", actualPackagedAmount),
                    new SqlParameter("@ActualPackagedPackId", actualPackagedPackId),
                    new SqlParameter("@LotLookupCode", lotLookupCode),
                    new SqlParameter("@WarehouseId", warehouseId),
                    new SqlParameter("@MaterialId", materialId),
                    new SqlParameter("@VendorLotLookupCode", vendorLotLookupCode),
                    new SqlParameter("@VendorLotManufactureDate", vendorLotManufactureDate),
                    new SqlParameter("@VendorLotExpirationDate", vendorLotExpirationDate),
                    new SqlParameter("@ShipmentId", shipmentId),
                    new SqlParameter("@netWeight", netWeight),
                    new SqlParameter("@grossWeight", grossWeight),
                    new SqlParameter("@serialLookupCode", serialLookupCode),
                    new SqlParameter("@licensePlateLookupCode", licensePlateLookupCode)
                    );
        }
    }
}

Вот метод, который вызывает этот метод для вставки данных в мою хранимую процедуру

private void SendStoredProcedureDataToFootPrint()
        {
            var lotList = _connection.ParseLot();
            var netWeightList = _connection.ParseNetWeight();
            var grossWeightList = _connection.ParseGrossWeight();
            var serialNumberList = _connection.ParseSerialNumber();
            var material = _unitOfWork.Shipments.GetLastMaterialEntry();
            var scanCounts = _connection.CountReceivingBarcodeEntries();
            var packagingId = _unitOfWork.Materials.GetPackagingId();
            var warehouse = _unitOfWork.Warehouses.GetWarehouseIdQuery();
            var shipment = _unitOfWork.Shipments.GetLastShipmentIdEntry();
            var licensePlate = _unitOfWork.LicensePlates.GetLastCreatedLicensePlate();


            try
            {
                for (var i = 0; i <= _connection.GetBarcodeList().Count; i++)
                {
                    _storedProcedureInsert.CallManualBlindBarcodeParsingEventRequestFootPrintProcedure
                    (
                        scanCounts,
                        packagingId,
                        lotList[i],
                        warehouse,
                        5785,
                        lotList[i],
                        DateTime.Now,
                        DateTime.Now,
                        shipment,
                        Convert.ToDecimal(netWeightList[i]) / 100,
                        Convert.ToDecimal(grossWeightList[i]) / 100,
                        serialNumberList[i],
                        licensePlate
                    );
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
                throw;
            }
        }

поэтому цель состоит в том, чтобы вставить данные в мою хранимую процедуру в цикле for без каких-либо проблем из переменных массива, которые могут иметь 1 или более значений.

Я пробовал другие источники, но помощь не была найдена.

1 Ответ

2 голосов
/ 12 марта 2019

Похоже, у вас есть исключение на стороне .NET из-за доступа к неверному индексу массива

for (var i = 0; i <= _connection.GetBarcodeList().Count; i++)

Должно ли это быть i < _connection.GetBarcodeList().Count; здесь? Последний индекс элемента в массиве равен _connection.GetBarcodeList().Count - 1, поэтому, я думаю, у вас есть исключение где-то здесь lotList[i],

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...