Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试检查int值是否确实是int_C#_Asp.net_Asp.net Core - Fatal编程技术网

C# 尝试检查int值是否确实是int

C# 尝试检查int值是否确实是int,c#,asp.net,asp.net-core,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

我试图检查一个传递的变量,以确保它确实是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
            }
        };

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

您的函数应该这样声明

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");
}
这条线看起来可疑:

public ListResult ProblemsYTD(int year = "")
您正在提供一个空字符串(“”)作为年份的默认值。我想您的意思是在传入参数时将其设置为字符串

public ListResult ProblemsYTD(string year = "")
我试图检查传递的变量,以确保它确实是Int类型

很可能您只需要使用

示例路线:

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+" }
);

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

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

此时,您对方法的声明应该是一个没有默认值的简单整数,或者您可以使用默认值零。
不能将空字符串用作整数的默认值。C#不允许像无严格限制的VB.NET选项那样在类型之间自由隐式转换

因此,电话应该是简单的

public ListResult ProblemsYTD(int year = 0)
此时,检查调用方是否传递了整数的所有代码都是无用的,因为调用方无法传递任何其他类型或值。只要整数或可以转换为整数而不丢失信息的类型(字节,短但不长),就可以声明接收整数的方法,并且编译器会使用编译错误阻止任何不同的类型

但是,您可以为年份变量添加一个合理值的检查。
例如,您可以使用类似这样的方法限制上限和下限值

    if (year >= 2000 && year <= DateTime.Today.Year)
    {
        sql += " = @year";
    }

如果(year>=2000&&year)您不能将int默认为空字符串。
public listress ProblemsYTD(int year=“”)
只需将其声明为int并删除默认值。我建议使用C#basics and types进行刷新。由于您正在声明一个正式参数(year),因此有一个错误作为int,但为其指定一个字符串值,这将导致错误
意味着您的查询将运行缓慢,因为它不是。与其使用
动态Sql来构建查询
,我还建议您将其转换为存储过程,并在需要时使用SqlCommand对象等来执行查询以及参数。
年参数声明中存在相同的问题。无法执行
int year=“”
。您想要
string year=“”
。是的,我在键入第一个答案并重新编写后看到了这一点。这可能只是一个注释,因为这个答案实际上并不能解决问题。
    if (year >= 2000 && year <= DateTime.Today.Year)
    {
        sql += " = @year";
    }