2015-07-25 3 views
0

Когда я пытаюсь получить Integer из моего SQLite db, я могу заставить его работать, читая его как строку, а затем запускаю на нем int.Parse. Правильно ли, я читал что-то об этом связанно с ExeculeScalar, возможно, отдав null?Получить целое число как строку, чтобы я мог разделить его на целое число?

Вот мой текущий код SendSQLExecScalar() посылает команду строки и т.д., и возвращает объект

public object SendSQLExecScalar(string C) 
{ 
     OpenConnection(); 
     SQLiteCommand SQLCommand = new SQLiteCommand(C, DbConnection); 

     try 
     { 
      object Output = SQLCommand.ExecuteScalar(); 
      CloseConnection(); 
      return Output; 
     } 
     catch (Exception X) 
     { 
      MessageBox.Show(X.Message); 
      return null; 
     } 
} 

И:

int ID = int.Parse(SendSQLExecScalar(C).ToString()); 

EDIT:

указано литая не действительный.

public static int GetImageID(string Path) 
{ 
    string C = "SELECT ID FROM Images WHERE Path LIKE '" + Path + "' LIMIT 1"; 

    return ConvertFromDBVal<int>(SendSQLExecScalar(C)); 
} 

public static T ConvertFromDBVal<T>(object obj) 
{ 
     if (obj == null || obj == DBNull.Value) 
     { 
      return default(T); 
     } 
     else 
     { 
      return (T)obj; //breaks here saying this cast is invalid 
     } 
} 
+1

Что именно делает метод SendSQLExecScalar? Не могли бы вы показать это определение? –

+0

Я добавил то, что вы просили – Unhek

ответ

0
(int)(long)SendSQLExecScalar(C); 

решаемые с этим, похоже, SQLite целое будет возвращать длинный предмет, который мне нужно распаковать перед заливкой его в междунар.

0

Я читал кое-что об этом приходится делать с execuleScalar возможно отдать нуль?

Да, если нет данных, что Ваш SQL запрос возвращает, ExecuteScalar возвращает null ссылки.

Если вы на 100% уверены, что возвращаемое значение в первом столбце первой строки равно ужеint, вы можете просто бросить его;

int ID = (int)SendSQLExecScalar(C); 

Для предотвращения нулевых дел по этому методу, я почти всегда использует rein's generic method, как;

public static T ConvertFromDBVal<T>(object obj) 
{ 
    if (obj == null || obj == DBNull.Value) 
    { 
     return default(T); // returns the default value for the type 
    } 
    else 
    { 
     return (T)obj; 
    } 
} 
+0

, в моем случае obj будет выводиться как число, например 5, если не null, а затем сломается, говоря, что листинг (int) 5 недопустим. – Unhek

+0

@Unhek Вы будете использовать этот общий метод для результата метода SendSQLExecScalar. И '(int) 5'. Каков ваш код, который показывает недопустимый листинг? –

+0

'public static int GetImageID (строка Path) { строка C = "SELECT ID FROM Images ГДЕ Путь LIKE'" + Path + "'LIMIT 1"; return ConvertFromDBVal (SendSQLExecScalar (C)); } общественности статической Т ConvertFromDBVal (объект OBJ) { , если (OBJ == NULL || OBJ == DBNull.Value) { возврата по умолчанию (Т); } прочее { возвращение (T) obj; } } ' – Unhek

0

Используйте TryParse вместо Parse, это позволяет проверить, что-то обрабатывается.

Если вы используете int.Parse() с недопустимым int, вы получите исключение, находясь в TryParse, оно возвращает логическое значение, позволяющее узнать, удалось ли выполнить синтаксический анализ.

Вкратце используйте Parse, если вы уверены, что значение будет действительным; в противном случае используйте TryParse.

int number = int.Parse(someString);  

int number; 
int.TryParse(someString, out number); 
Смежные вопросы