C# & ASP. NET MVC 5 - выполнить хранимую процедуру нажатием кнопки без возврата значений - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь (мне нужно) создать небольшое веб-приложение для управления некоторыми процессами ETL, давая моим пользователям несколько кнопок для просмотра SQL данных сервера и запуска нескольких пакетов служб SSIS.

I смог обработать создание сайта с помощью C# ASP. NET MVC учебника CRUD ЗДЕСЬ (очень полезно) и показать нужные мне данные.

Затем я создал модель данных, указывающую на мои таблицы и хранимые процедуры, и теперь мне «только» нужно создать базовую страницу c с текстовым полем для вставки параметра и кнопки для каждой хранимой процедуры, которая мне нужна для запуска.

Каждая хранимая процедура будет запускать пакет служб SSIS, которому пока не требуется возвращать какое-либо значение.

РЕДАКТИРОВАТЬ: мне удалось собрать дополнительную информацию и изменить код вот так

Контроллер

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Italist_Admin.Models;
using System.Data.SqlClient;
using System.Data.Entity.Core.Objects;

namespace Project.Controllers
{
    public class ToolsController : Controller
    {
        private ProjectEntities db = new ProjectEntities();

        public ActionResult Index()
        {
            ProjectEntities entities = new ProjectEntities();
            //return View(entities.SPU_RUNSSIS(""));
            return View();

        }
        [HttpPost]

        public ActionResult ExecExportOnly(string txtPeriod)  // to get the Student Details  
        {
            ProjectEntities entities = new ProjectEntities();

            entities.SPU_RUNSSIS(parameter);
            return View();

        }}}

Вид

@{
    ViewBag.Title = "Tools";
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Export Only</title>
</head>
<body>
    <div>
        @using (Html.BeginForm("ExecExportOnly", "Tools", FormMethod.Post))
        {
            <span>Period:</span> @Html.TextBox("txtPeriod")
            <input type="submit" value="Run Export" />
        }
    </div>
</body>
</html>

Модель

  public virtual int SPU_RUNSSIS(string parameter)
    {
        var periodParameter = period != null ?
            new ObjectParameter("parameter", parameter) :
            new ObjectParameter("parameter", typeof(string));

        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300;
        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SPU_RUNSSIS", parameterParameter);

    }

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

При выполнении этого кода упакованный сбой ( SqlException: пакет не прошел. Проверьте журналы каталога служб SSIS для получения дополнительной информации ) примерно через 30 секунд в любом случае и В КОНЦЕ 30 секунд, которые я вижу в SQL Трассировка следующего сообщения

RP C: Завершено - exe c [dbo]. [SPU_RUNSSIS] @ parameter = 'parametervalue'

Если я вручную запустил приведенный выше код, он сработает.

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

Заранее спасибо за любые предложения

1 Ответ

0 голосов
/ 21 апреля 2020

Мне удалось обойти проблему, запустив SSIS непосредственно из кода c# вместо выполнения хранимой процедуры, которая затем запускает выполнение SSIS.

Возможно, не лучшее решение, но, похоже, оно работает :

public ActionResult Index()
    {
        project entities = new project();
        return View();

    }
    public ActionResult ExecExportOnly(string txtPeriod)
    {
        project entities = new project();

        string targetServerName = ConfigurationManager.AppSettings["targetServerName"];
        string folderName = ConfigurationManager.AppSettings["folderName"];
        string projectName = ConfigurationManager.AppSettings["projectName"]; 
        string SSIS_ExportOnly = ConfigurationManager.AppSettings["SSIS_ExportOnly"];

        // Create a connection to the server
        string sqlConnectionString = ConfigurationManager.ConnectionStrings["Variable1"].ConnectionString;

        SqlConnection sqlConnection = new SqlConnection(sqlConnectionString);

        // Create the Integration Services object
        IntegrationServices integrationServices = new IntegrationServices(sqlConnection);

        // Get the Integration Services catalog
        Catalog catalog = integrationServices.Catalogs["SSISDB"];

        // Get the folder
        CatalogFolder folder = catalog.Folders[folderName];

        // Get the project
        ProjectInfo project = folder.Projects[projectName];

        // Get the package
        PackageInfo package = project.Packages[SSIS_ExportOnly];

        //Set Parameters
        // Add a parameter collection for 'system' parameters (ObjectType = 50), package parameters (ObjectType = 30) and project parameters (ObjectType = 20)
        Collection<PackageInfo.ExecutionValueParameterSet> executionParameter = new Collection<PackageInfo.ExecutionValueParameterSet>();

        // Add execution parameter (value) to override the default asynchronized execution. If you leave this out the package is executed asynchronized
        //executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "SYNCHRONIZED", ParameterValue = 1 });

        // Add execution parameter (value) to override the default logging level (0=None, 1=Basic, 2=Performance, 3=Verbose)
        executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "LOGGING_LEVEL", ParameterValue = 3 });

        // Add a project parameter (value) to fill a project parameter
        //executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 20, ParameterName = "MyProjectParameter", ParameterValue = "some value" });

        // Add a project package (value) to fill a package parameter
        executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 30, ParameterName = "ParamPeriod", ParameterValue = txtPeriod });

        // Get the identifier of the execution to get the log
        //long executionIdentifier = package.Execute(false, null, executionParameter);

        // Run the package
        package.Execute(true, null,executionParameter);

        return View("Index");
    }

Спасибо в любом случае! R

...