2014-09-22 4 views
0

Я использую ORM для управления моей базой данных SQLite в своем проекте C#. Это все: https://github.com/praeclarum/sqlite-netsystem.reflection.targetinvocationexception SQLite

Это действительно надежный, но я не могу использовать запрос SELECT. Когда я запускаю это:

var transacts = db.Table<Transact>(); 

я получаю взамен это исключение: system.reflection.targetinvocationexception на этой линии:

public void SetValue(object obj, object val) 
{ 
    _prop.SetValue(obj, val, null); 
} 

Полное сообщение: system.reflection.targetinvocationexception exception has been thrown by the target of an invocation

И у меня есть конструкторы:

public Transact() 
    : base() 
{ 
    Console.WriteLine("yo"); 
} 

public Transact(int subCategoryIdT, string descriptionT, 
    DateTime dateT, double amountT, int ownerIdT) 
{ 
    db.CreateTable<Transact>(); 
    SubCategoryId = subCategoryIdT; 
    Description = descriptionT; 
    Date = dateT; 
    Amount = amountT; 
    OwnerId = ownerIdT; 
    db.Insert(this); 
    Console.WriteLine("I'm here !! I'm " + description + "."); 

} 

Может лет Вы видите, где мои ошибки?

Содержание InnerException:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Exception: Busy 
    at SQLite.SQLiteCommand.ExecuteNonQuery() [0x000c6] in /Users/gautier/Documents/Dev/csharp/bumget/bumget/SQLite.cs:2087 
    at SQLite.SQLiteConnection.Execute (System.String query, System.Object[] args) [0x00046] in /Users/gautier/Documents/Dev/csharp/bumget/bumget/SQLite.cs:627 
    at bumget.Transact.set_OwnerId (Int32 value) [0x0003a] in /Users/gautier/Documents/Dev/csharp/bumget/bumget/Transact.cs:49 
    at at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) 
    at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0 
    --- End of inner exception stack trace --- 

Мой Transact класс:

using System; 
using System.IO; 
using SQLite; 

namespace bumget 
{ 
    public class Transact 
    { 
     private int ownerId; 
     private int subCategoryId; 
     private string description; 
     private DateTime date; 
     private double amount; 
     private int expense; 

     private SQLiteConnection db = new SQLiteConnection (Path.Combine(Directory.GetCurrentDirectory(), "bumget.db3")); 

     public Transact() : base() { 
     } 

     public Transact (int subCategoryIdT,string descriptionT,DateTime dateT,double amountT,int ownerIdT, int expenseT) 
     { 
      db.CreateTable<Transact>(); 
      SubCategoryId = subCategoryIdT; 
      Description = descriptionT; 
      Date = dateT; 
      Amount = amountT; 
      OwnerId = ownerIdT; 
      Expense = expenseT; 
      db.Insert (this); 
      Console.WriteLine("I'm here !! I'm "+description+"."); 

     } 

     [PrimaryKey, AutoIncrement] 
     public int Id { 
      get; 
      private set; 
     } 

     public int OwnerId 
     { 
      get{ 
       return ownerId; 
      } 
      set{ 
       ownerId = value; 
       db.Execute("UPDATE Transact SET OwnerId = ? WHERE Id = ?",OwnerId,Id); 
      } 

     } 

     public int Expense 
     { 
      get{ 
       return expense; 
      } 
      set{ 
       expense = value; 
       db.Execute("UPDATE Transact SET Expense = ? WHERE Id = ?",Expense,Id); 
      } 

     } 

     public int SubCategoryId 
     { 
      get { 
       return subCategoryId; 
      } 
      set{ 
       subCategoryId = value; 
       db.Execute("UPDATE Transact SET SubCategoryId = ? WHERE Id = ?",SubCategoryId,Id); 
      } 
     } 

     public string Description 
     { 
      get{ 
       return description; 
      } 
      set{ 
       description = value; 
       db.Execute("UPDATE Transact SET Description = ? WHERE Id = ?",Description,Id); 
      } 
     } 

     public DateTime Date 
     { 
      get{ 
       return date; 
      } 
      set{ 
       date = value; 
       db.Execute("UPDATE Transact SET Date = ? WHERE Id = ?",Date,Id); 
      } 
     } 

     public double Amount 
     { 
      get{ 
       return amount; 
      } 
      set{ 
       amount = value; 
       db.Execute("UPDATE Transact SET Amount = ? WHERE Id = ?",Amount,Id); 
      } 
     } 

     public override string ToString() 
     { 
      return "Utilisateur :" + OwnerId + ", Montant: " + Amount + "CAN$, Date: " + Date.ToString() + ", Category : " + SubCategoryId + ", Description : " + Description + ", Owner = "+OwnerId + ", expense = "+Expense; 
     } 

    } 
} 
+1

Что сообщение исключения? Какие данные вы передаете методу '_prop.SetValue'? – gunr2171

+0

@ gunr2171 Я редактировал свое сообщение, и я передаю нулевой объект + целое число (это то, что я вижу при печати obj и val) – Gautier

+0

Если 'obj' равно null, это не сработает. Вы не можете присвоить значение свойства нулевому объекту. – gunr2171

ответ

0

К сожалению, независимо от того, насколько хорошо ООП, реализации в.ч. SQLite не всегда работает, как задумано, и часто вам лучше просто написать SQL-запрос самостоятельно.

Сказав это, вы правильно настроили свои свойства? В вашей БД у вас есть поле Owner вместо OwnerId, так что вам нужно присвоить атрибут [Column(Name="Owner")] ваших OwnerId собственности

+0

Спасибо за ваш ответ, но у меня есть поле OwnerId в моей БД, например, эта команда отлично работает: 'db.Execute (« UPDATE Transact SET OwnerId =? WHERE Id =? », OwnerId, Id)' – Gautier

+0

I Я уверен, что проблема - это просто сопоставление вашего свойства OwnerId. В вашем методе SELECT выше вы написали, что вывод: Пользователь: 0, Montant: 0CAN $, Дата: 01/01/0001 00:00:00, Категория: 0, Описание:, Owner = 0, расход = False В этом случае я не вижу поля OwnerId, только Owner. Но, знаете, видя, что ваша модель данных C# и ваш SQL-запрос на создание таблицы будут чрезвычайно удобны при ответе на вопросы, основанные на SQL. –

+0

'общественного переопределение строки ToString() \t \t { \t \t \t возврата "Пользователь:" + OwnerId +», Montant: "+ Сумма + "CAN $ Дата:" + Date.toString() +", Категория: "+ SubCategoryId +", Описание: "+ Описание +", Владелец = "+ OwnerId +", расход = "+ Расходы; \t \t} 'Именно поэтому вы видите Владельца, а не OwnerId ... – Gautier

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