从实体框架调用时存储过程错误

时间:2017-09-19 14:50:01

标签: c# sql-server entity-framework

我正在尝试构建一个运行我的存储过程的简单项目。

当我通过SQL-Server执行SP时,它工作正常:

EXECUTE RunSSISPackage1        
  @folder_name1 = N'SSIS projects',
  @project_name1=N'CalculateReports',
  @package_name1=N'CalculateReports.dtsx',
  @param1 = N'2017-04-01 00:00:00',
  @param1name = N'startDate'

我的控制器:

public IActionResult Test()
{
    using (var cmd = _context.Database.GetDbConnection().CreateCommand())
    {
        cmd.CommandText = "RunSSISPackage";
        cmd.CommandType = CommandType.StoredProcedure;
        // set some parameters of the stored procedure
        cmd.Parameters.Add(new SqlParameter("@package_name1", SqlDbType.NVarChar)
        {
            Value = "N'CalculateReports.dtsx'"
        });
        cmd.Parameters.Add(new SqlParameter("@folder_name1", SqlDbType.NVarChar)
        {
            Value = "N'SSIS projects'"
        });
        cmd.Parameters.Add(new SqlParameter("@project_name1", SqlDbType.NVarChar)
        {
            Value = "N'CalculateReports.dtsx'"
        });
        cmd.Parameters.Add(new SqlParameter("@param1", SqlDbType.NVarChar)
        {
            Value = "N'2017-04-01 00:00:00'"
        });
        cmd.Parameters.Add(new SqlParameter("@param1name", SqlDbType.NVarChar)
        {
            Value = "N'startDate'"
        });
        if (cmd.Connection.State != ConnectionState.Open)
            cmd.Connection.Open();

        cmd.ExecuteNonQuery();

        return View();
    }
}

我收到错误:

  

无法访问包或包不存在。验证包是否存在以及用户是否具有该权限。

如果未正确发送package_name\folder_name\project_name的参数,则会发生此错误。

如何将前缀值作为参数传递?

1 个答案:

答案 0 :(得分:3)

您不需要代码中的N'...'换行,这只是用于unicode转换的SQL Server。例如,请参阅this。因此,当您执行此操作时,您实际上传递的N'CalculateReports.dtsx'包名称显然不存在。

相反,请执行此操作Value = "CalculateReports.dtsx",例如:

cmd.Parameters.Add(new SqlParameter("@package_name1", SqlDbType.NVarChar)
{
    Value = "CalculateReports.dtsx"
});
cmd.Parameters.Add(new SqlParameter("@folder_name1", SqlDbType.NVarChar)
{
    Value = "SSIS projects"
});
cmd.Parameters.Add(new SqlParameter("@project_name1", SqlDbType.NVarChar)
{
    Value = "CalculateReports.dtsx"
});
cmd.Parameters.Add(new SqlParameter("@param1", SqlDbType.NVarChar)
{
    Value = "2017-04-01 00:00:00"
});
cmd.Parameters.Add(new SqlParameter("@param1name", SqlDbType.NVarChar)
{
    Value = "startDate"
});