试图检查int值是否确实是int

时间:2016-06-29 21:45:01

标签: c# asp.net asp.net-core

我正在尝试检查传递的变量以确保它确实是Int类型。但是,我一直出现错误,告诉我变量“year”无法从int转换为字符串。我被困了,因为我不是想把它转换成所以我对我所缺少的东西感到困惑。

    [HttpGet("[action]")]
    [Authorize]
    public ListResult ProblemsYTD(int year = "")
    {
        var sql = "SELECT DatePart(yyyy, CLL.Call_Log_Date) as [ProblemsYear], CLL.Service as [Service], Sum((DATEDIFF(dd, CLL.Call_Log_Date, GetDate()))) as [DaysOpen] " +
                "FROM VMWareSM_Test.dbo.RV_CALL as CLL " +
                "Where CLL.IPK_Stream_Ref = '19' And DatePart(yyyy, CLL.Call_Log_Date)";

        int myInt;
        if (!int.TryParse(year, out myInt))
        {
            year = "%" + year + "%";
            sql += " = @year";
        }

        sql += " Group by CLL.Service, DatePart(yyyy, CLL.Call_Log_Date) "+
                "Order by CLL.Service DESC; "; 

        SqlParameter[] sqlParams =
        {
            new SqlParameter
            {
                ParameterName = "@year",
                Value = year,
                DbType = DbType.Int32,
                Direction = ParameterDirection.Input
            }
        };

5 个答案:

答案 0 :(得分:2)

让我们从您使用变量 year 开始。它用作where条件的一部分,其中还涉及DatePart函数调用。现在DataPart返回一个整数,因此您需要一个整数用于检查,而不是字符串。

此时,您对方法的声明应该是一个没有默认值的整数,或者您可以使用默认值零。
您不能将空字符串用作整数的默认值。 C#不允许像Option Strictless VB.NET

这样的类型之间的这种自由隐式转换

所以电话应该只是

public ListResult ProblemsYTD(int year = 0)

此时检查调用者是否已传递整数的所有代码都是无用的,因为调用者无法传递任何其他类型的值或值。只是整数或类型可以转换为整数而不丢失信息(字节,短但不长)您声明方法接收整数,编译器阻止任何不同类型的编译错误。

但是,您可以为年变量添加合理值的检查 例如,你可以用这样的

来限制上限值和下限值
    if (year >= 2000 && year <= DateTime.Today.Year)
    {
        sql += " = @year";
    }

请注意,您不能将“%”符号连接到整数,原因与您无法将空字符串分配给整数的原因相同。

答案 1 :(得分:1)

你的功能应该像这样声明

public ListResult ProblemsYTD(string year = "")
{
 ...
}

year = "%" + year + "%"; 由于LIKE语句中使用了%

,因此不行

应该是这样的:

if (int.TryParse(year, out myInt))
{
   sql += " = @" + year;
}
else 
{
   throw new Exception("Year is not in correct format");
}

答案 2 :(得分:1)

这条线看起来很可疑:

public ListResult ProblemsYTD(int year = "")

您提供一个空字符串(“”)作为year的默认值。我认为你的意思是在传入参数时将参数设置为字符串。

public ListResult ProblemsYTD(string year = "")

答案 3 :(得分:1)

  

我正在尝试检查传递的变量以确保它确实是Int类型。

您很可能只需要使用Route Constraint

示例路线:

routes.MapRoute(
  "Product",
  "Product/{productId}",
  new {controller="Product", action="Details"}
);

控制器:

public class ProductController : Controller
{
    public ActionResult Details(int productId)
    {
        return View();
    }
}

以下产生错误:

/Product/blah
/Product/apple

您可以添加路由约束以仅路由到控制器/操作(如果它是int:

routes.MapRoute(
  "Product",
  "Product/{productId}",
  new {controller="Product", action="Details"},
  new {productId = @"\d+" }
);

这意味着您的控制器不负责类型检查(无论如何都不应该),您可以创建另一条路径来捕获非内部并相应地显示不同的视图。

答案 4 :(得分:0)

int year = ""

您不能将整数变量设置为字符串值。