2015-11-21 2 views
0

Мне не удалось найти ответ, который помог мне, так что здесь мы идем,C# Sqlite InvalidCastException

Я это функция, которая делает команду для моего SQLiteDataAdapter, Сейчас он работает все хорошо в моей программе, которая использует FireBird, к сожалению, теперь я работаю над мобильным фреймворком, и он, похоже, не работает здесь.

public DataTable Get(string tableName, string[] selectColumns, string[] conditionColumns, 
         object[] conditionValues) 
    { 
     if (conditionColumns.Length != conditionValues.Length) 
     { 
      throw new Exception("Length of columns and values is different"); 
     } 

     DataTable dt = new DataTable(); 
     StringBuilder stringB = new StringBuilder(); 
     try 
     { 
      stringB.Append("SELECT "); 
      if (selectColumns == null) 
      { 
       stringB.Append("* "); 
      } 
      else 
      { 
       for (int i = 0; i < selectColumns.Length; i++) 
       { 
        stringB.Append(selectColumns[i]); 
        if (i == selectColumns.Length - 1) 
        { 
         stringB.Append(" "); 
        } 
        else 
        { 
         stringB.Append(", "); 
        } 
       } 
      } 
      stringB.Append("FROM "); 
      stringB.Append(tableName + " "); 
      stringB.Append("WHERE ("); 
      for (int i = 0; i < conditionColumns.Length; i++) 
      { 
       stringB.Append(conditionColumns[i] + " = @" + conditionColumns[i]); 
       if (i < (conditionColumns.Length - 1)) 
       { 
        stringB.Append(" AND "); 
       } 
       else 
       { 
        stringB.Append(")"); 
       } 
      } 
      SQLiteDataAdapter da = new SQLiteDataAdapter(stringB.ToString(), connection); 

      for (int i = 0; i < conditionColumns.Length; i++) 
      { 
       da.SelectCommand.Parameters.Add("@" + conditionColumns[i], (DbType)conditionValues[i]); 
      } 
      da.Fill(dt); 
      return dt; 
     } 
     catch (Exception e) 
     { 
      throw new Exception("Database error :\r\n" + stringB + "\r\n" + e.Message, e); 
     } 
    } 

Теперь это я моя функция, ошибка выкинут на

da.SelectCommand.Parameters.Add("@" + conditionColumns[i], (DbType)conditionValues[i]); 

с ошибкой

Ошибка базы данных: SELECT * FROM ЖИВОТНЫХ WHERE (animal_number = @animal_number) InvalidCastException

Я не уверен, что сейчас валю, я бросаю DbType, так как его единственный тип, который он, похоже, принимает, но все же выдает ошибку.

ответ

1

С conditionValues[i] возвращает object, вы не можете явно разобрать его на DbType.

Вы можете проверить свой объект с помощью is operator, чтобы получить его совместимый тип.

Например,

if(conditionValues[i] is int) 
{ 
    da.SelectCommand.Parameters.Add("@" + conditionColumns[i], DbType.Int32).Value = conditionColumns[i]; 
} 
+0

Кажется, закрепилась это, спасибо –

+0

Так быстрый вопрос, что АЛС делать с забросов, я пытаюсь вытащить элемент из моего SQLite базы данных, как этот animal.FeedScheduleType = (BcFeedScheduleType) drAnimal [ «feedschedule_type» ]; Где BcFeedScheduleType является общедоступным enum, теперь он бросает мне InvalidCastException, у вас есть идея, почему? или как это исправить? –

+0

Попробуйте что-то вроде animal.FeedScheduleType = (BcFeedScheduleType) Convert.ToInt32 (drAnimal ["feedschedule_type"]); –

Смежные вопросы