C# 尝试检查int值是否确实是int
我试图检查一个传递的变量,以确保它确实是Int类型的。但是,我一直出现一个错误,告诉我变量“year”无法从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
[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";
}