2016-06-29 6 views
-1

Я пытаюсь проверить переданную переменную, чтобы убедиться, что это действительно тип Int. Однако у меня появляется ошибка, которая говорит мне, что переменная «год» не может быть преобразована из int в строку. Я застрял, потому что я не пытаюсь преобразовать его, поэтому я смущен тем, что мне не хватает.Попытка проверить, действительно ли значение int действительно 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 
      } 
     }; 
+3

Вы не можете установить int в пустую строку. – dburgener

+1

'public ListResult ProblemsYTD (int year =" ")' просто объявить его как int и year удалить значение по умолчанию .. Я бы предложил обновить основы C# и типы – MethodMan

+1

Ошибка, так как вы объявляете формальный параметр (год) как int, но присваивая ему значение, которое является строкой, которая вызовет ошибку. – user3210251

ответ

2

Начнем с использования вами переменной года. Он используется как часть условия, в котором также задействован вызов функции DatePart. Теперь DataPart возвращает целое число, поэтому для ваших проверок требуется целое число, а не строка.

На этом этапе ваше объявление метода должно быть простым целым числом без значения по умолчанию или вы могли бы использовать значение по умолчанию, равное нулю.
Вы не можете использовать пустую строку в качестве значения по умолчанию для целого числа. C# не допускает этих свободных неявных преобразований между типами, такими как Option Strictless VB.NET

Поэтому вызов должен быть просто

public ListResult ProblemsYTD(int year = 0) 

в этот момент весь код, который проверяет, является ли абонент прошло целое бесполезно, потому что абонент не может передать любой другой вид типа или значения. Просто целые числа или типы, которые могут быть переданы в целое число без потери информации (байт, короткий, но не долго). Вы объявляете метод для получения целого числа, а компилятор блокирует любой другой тип с ошибкой компиляции.

Однако вы можете добавить чек на разумную величину для своей переменной года.
Например, вы могли бы ограничить верхние и нижние значения с чем-то вроде этого

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

Обратите внимание, что вы не можете сцепить символ «%» до целого числа по той же причине, что вы не можете присвоить пустую строку в целое число ,

0
int year = "" 

Вы не можете установить целочисленную переменную строковое значение.

+0

Та же проблема в декларации параметр 'year'. Невозможно выполнить 'int year =" "'. Вы хотите 'string year =" "'. – wablab

+0

Да, я видел это после того, как я набрал свой первый ответ, а затем переписал его. – howcheng

+3

Возможно, это просто комментарий, так как этот ответ на самом деле не решает проблему. –

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

Эта линия выглядит рыбным:

public ListResult ProblemsYTD(int year = "") 

Вы предоставляете пустую строку ("") в качестве значения по умолчанию для года. Я думаю, что вы имеете в виду, чтобы иметь параметр быть строка, когда он передается в

public ListResult ProblemsYTD(string year = "") 
1

I'm trying to check a passed variable to ensure that it is indeed of type 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+" } 
); 

Это означает, что контроллер не в взимать плату за проверку типа (это, вероятно, не обязательно), и вы можете создать другой маршрут, чтобы поймать non-int и отобразить другое представление соответственно.