我正在尝试检查传递的变量以确保它确实是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
}
};
答案 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 = ""
您不能将整数变量设置为字符串值。