2017-04-25 1 views
0

J'utilise ServiceStack.OrmLite v4.0.62 (le dernier pour .NET Framework 4.0). Et je travaille avec la base de données SQLite. Donc, sur mon interface utilisateur, j'ai un formulaire qui contient des champs de recherche. Et en fonction des conditions définies par l'utilisateur, je génère dynamiquement Expression<Func<T, bool>>. Ensuite, ma fonction a la vue suivante:OrmLite renvoie une erreur inconnue Paramètres insuffisants fournis à la commande

/// <summary> 
/// Gets the number of records in table corresponding the specified criteria 
/// </summary> 
/// <param name="predicate">Search criteria</param> 
/// <returns></returns> 
public virtual long CountByCondition(Expression<Func<T, bool>> predicate) 
{ 
    // bug: OrmLite !string.IsNullOrWhiteSpace(someStringValue) function causes error while building predicate 

    var q = Db.Connection.From<T>(); 
    q = q.Where(predicate); 
    string cnt = q.ToCountStatement(); 
    // here we have an Exception 
    return Db.Connection.Scalar<long>(cnt, q.Params); 
    //return Db.Connection.Count<T>(predicate); 
} 

La ligne de bogue est pour moi de savoir (et pour les développeurs OrmLite) et il ne concerne pas le problème actuel. Par exemple, q.Params contient 11 paramètres avec des noms de "@0" à "@10". Mais permet de regarder à SQL a été générée:

SELECT COUNT(*) 
FROM "Person" 
WHERE ("IsTer" = @0) AND 
     upper("Pib") like @1 AND 
     "Id" IN (SELECT DISTINCT "PersonId" 
       FROM "Predmet" 
       WHERE ("PType" = @2 AND 
         (upper("PValue") like @3 OR upper("PValue") like @4 OR upper("PValue") like @5 OR upper("PValue") like @6 OR upper("PValue") like @7 OR upper("PValue") like @8)) AND 
         ("PType" = @9 AND upper("PValue") like @30) 

Vous voyez qu'il ya un certain décalage dans les noms de paramètres qui est le nom du dernier paramètre est « @30 »! Et je pense que cela est la raison pour laquelle la commande renvoie une exception ici sont la pile complète:

"unknown error Insufficient parameters supplied to the command"; 
"System.Data.SQLite.SQLiteException";" 
    в System.Data.SQLite.SQLiteStatement.BindParameter(Int32 index, SQLiteParameter param) 
    в System.Data.SQLite.SQLiteStatement.BindParameters() 
    в System.Data.SQLite.SQLiteCommand.BuildNextCommand() 
    в System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index) 
    в System.Data.SQLite.SQLiteDataReader.NextResult() 
    в System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave) 
    в System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior) 
    в System.Data.SQLite.SQLiteCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    в ServiceStack.OrmLite.OrmLiteCommand.ExecuteReader() 
    в ServiceStack.OrmLite.OrmLiteReadCommandExtensions.ExecReader(IDbCommand dbCmd, String sql) 
    в ServiceStack.OrmLite.OrmLiteResultsFilterExtensions.Scalar[T](IDbCommand dbCmd, String sql) 
    в ServiceStack.OrmLite.OrmLiteResultsFilterExtensions.Scalar[T](IDbCommand dbCmd, String sql, IEnumerable`1 sqlParams) 
    в ServiceStack.OrmLite.OrmLiteReadApi.<>c__DisplayClass3f`1.<Scalar>b__3e(IDbCommand dbCmd) 
    в ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func`2 filter) 
    в ServiceStack.OrmLite.OrmLiteReadExpressionsApi.Exec[T](IDbConnection dbConn, Func`2 filter) 
    в ServiceStack.OrmLite.OrmLiteReadApi.Scalar[T](IDbConnection dbConn, String sql, IEnumerable`1 sqlParams) 
    в Reestr.DAL.Repositories.Repository`1.CountByCondition(Expression`1 predicate) в d:\Project\Reestr\Reestr.DAL\Repositories\Repository.cs:строка 113 
    в Reestr.DAL.Repositories.PersonRepository.CountByCondition(Expression`1 predicate) в d:\Project\Reestr\Reestr.DAL\Repositories\PersonRepository.cs:строка 47 
    в Reestr.BLL.Services.PersonService.GetDataBy(Expression`1 predicate, Int32 pageNumber, Int32 pageSize) в d:\Project\Reestr\Reestr.BLL\Services\PersonService.cs:строка 202 
    в Reestr.WinForms.Views.FrmMain.BindGrid(Int32 pageIndex, Expression`1 predicate, SortInfo`1 sortInfo) в d:\Project\Reestr\Reestr.WinForms\Views\FrmMain.cs:строка 427" 

Alors, s'il vous plaît pourrait yopu me aider à résoudre ce problème ou expliquer pourquoi il est si? Ai-je besoin de modifier manuellement le code SQL généré? Je pense que ce n'est pas un bon choix pour résoudre le problème actuel.

MISE À JOUR

Aujourd'hui, j'essayé de générer une autre expression de recherche et est le SQL qui OrmLite a produit ici:

SELECT COUNT(*) 
FROM "Person" 
WHERE ("IsTer" = @0 OR "IsTax" = @1) AND 
     upper("Pib") like @2 AND 
     "Bd" > @3 AND 
     upper("Inn") like @4 AND 
     upper("Bp") like @5 AND 
     upper("Lp") like @6 AND 
     upper("Doc") like @7 AND 
     upper("Gr") like @8 AND 
     upper("Org") like @9 AND 
     upper("Pseudo") like @10 AND 
     "Id" IN (SELECT DISTINCT "PersonId" 
       FROM "Predmet" 
       WHERE ("PType" = @11 AND 
        (upper("PValue") like @12 OR upper("PValue") like @123 OR upper("PValue") like @124 OR upper("PValue") like @125 OR upper("PValue") like @126)) AND 
        ("PType" = @127 AND upper("PValue") like @128) AND 
        ("PType" = @129 AND upper("PValue") like @1230) AND 
        ("PType" = @1231 AND upper("PValue") like @1232 escape '^') AND 
        ("PType" = @1233 AND upper("PValue") like @1234) AND 
        ("PType" = @1235 AND upper("PValue") like @1236) 

Et je ne peux pas comprendre ce qui se passe. Nous voyons des paramètres avec des noms étranges et bien sûr il n'y a pas de paramètres avec de tels noms dans la collection q.Params ...

Répondre

0

Ceci a été corrigé dans les dernières versions ...