simpledeveloper Ответов: 1

Контексте.базы данных.SQL-запрос, чтобы загрузить файл Excel


Привет, я пытаюсь загрузить файл Excel, передавая данные excel в качестве пользовательского типа данных в хранимую процедуру с использованием Entity Framework и кода C# в ASP.Сетевое применение как показано ниже:
public System.Int32 UploadServiceProgram(List<ServicePrograms_Upload> serviceProgList, string Fiscal_Period_Code, string CreatedBy)
{
    DataTable serviceProgramDataTable = new DataTable();
    serviceProgramDataTable.Columns.Add("ServiceCode", typeof(string));
    serviceProgramDataTable.Columns.Add("ProgramCode", typeof(int));
    serviceProgramDataTable.Columns.Add("UnitTypeDesc", typeof(string));
    serviceProgramDataTable.Columns.Add("RateCap", typeof(decimal));
    serviceProgramDataTable.Columns.Add("CountyCode", typeof(string));


    foreach (var item in serviceProgList)
    {
        serviceProgramDataTable.Rows.Add(item.Provided_Service_Code, item.Program_Code, item.Unit_Type, item.Rate_Cap);
    }

    var parameter = new SqlParameter("@ServiceProgram", SqlDbType.Structured);
    parameter.Value = serviceProgramDataTable;
    parameter.TypeName = "dbo.ServicePrograms_UDT";

    var parameter2 = new SqlParameter("@Fiscal_Period_Code", SqlDbType.NVarChar, 15);
    parameter2.Value = Fiscal_Period_Code;

    var parameter3 = new SqlParameter("@CreatedBy", SqlDbType.NVarChar, 50);
    parameter3.Value = CreatedBy;

    using (var context = new CRSContext())
    {
        context.Database.CommandTimeout = 360000;
        var result = context.Database.SqlQuery<int>("usp_Upload_ServicePrograms @ServiceProgram, @Fiscal_Period_Code, @CreatedBy", parameter, parameter2, parameter3).FirstOrDefault();

        return result;
    }
}

Он терпит неудачу по какой-то причине, но тот же файл Excel, который я экспортировал в таблицу, затем создает табличную переменную типа (определяемого пользователем типа), которую я использую, затем вставляет в эту табличную переменную из таблицы, в которой у меня есть данные Excel, затем выполнение хранимой процедуры не терпит неудачи на самом деле импортирует данные как есть, я не уверен, почему хранимая процедура выполняется, но вышеприведенный метод терпит неудачу, в обоих случаях хранимая процедура и Excel одинаковы. Вот как я выполняю хранимую процедуру:
declare @ServiceProgram ServicePrograms_UDT
declare @fiscalPeriod nvarchar(15)='FY 2016-2017', @CreatedBy nvarchar(50)='aaleemmo'

insert into @ServiceProgram(ServiceCode, ProgramCode, UnitTypeDesc, RateCap, CountyCode)
select [service code], [Program Code], [Unit Type], [Rate Cap], [County Code] from SUDCRS..zzServiceProgramCountyExcelData

exec dbo.usp_Upload_ServicePrograms @ServiceProgram, @fiscalPeriod, @CreatedBy

И еще одно сомнение, которое у меня есть, когда мой сервис WCF публикует эти огромные данные excel как datatable в базу данных, потеряет ли он данные, когда он публикует огромные данные, если он теряет их, есть ли какой-либо другой подход, который я могу выполнить эту хранимую процедуру.
Пожалуйста, дайте мне знать все, что возможно, предложение, фрагмент кода или даже крошечное предложение, любая вещь помогает, это немного срочно - пожалуйста, большое спасибо.

Что я уже пробовал:

запуск несколько раз, поиск в интернете

1 Ответов

Рейтинг:
0

#realJSOP

Я написал статью об импорте файла excel/csv в объект datatable. Оттуда довольно просто получить импортированные данные в таблицу в sql server.

CSV/Excel File Parser - A Revisit[^]

Результатом, представленным кодом в этой статье, является datatable с заголовками столбцов и автоматически определенными (или заданными вручную) типами данных для столбцов.

Быстрое/грязное решение для получения проанализированных данных в таблицу sql server-это:

SqlBulkCopy sbc = new SqlBulkCopy(myConnection);
sbc.DestinationTableName = datatable.TableName;
try                             
{                                 
    sbc.WriteToServer(table);                            
}     
catch(Exception ex)
{
    // do something with the exception
}


Конечно, есть и другие вещи, которые вы должны сделать, чтобы заставить этот код работать (например, таблица назначения уже должна существовать), но вы говорите так, как будто вы достаточно самосознательны, чтобы самостоятельно указать эту часть.