2017-04-25 13 views
0

ServiceStack.OrmLite v4.0.62 (.NET Framework 4.0의 경우 마지막 것)를 사용하고 있습니다. 그리고 SQLite 데이터베이스로 작업합니다. 따라서 UI에는 검색 필드가 포함 된 양식이 있습니다. 그리고 사용자가 설정 한 조건에 따라 동적으로 Expression<Func<T, bool>>을 생성합니다. 그럼 내 함수는 다음과 같은 관점을 가지고 있습니다 :OrmLite가 알 수없는 오류를 발생시킵니다. 명령에 제공된 매개 변수가 충분하지 않습니다.

/// <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); 
} 

버그 선은 나를 (그리고 OrmLite 개발자들에게) 알기 때문에 현재의 문제와 관련이 없습니다. 예를 들어, q.Params에는 "@0"에서 "@10"까지의 이름을 가진 11 개의 매개 변수가 포함되어 있습니다. 하지만은 SQL에서 시계가 생성 된 수 있습니다 :

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) 

는 마지막 매개 변수의 이름은 "@30"입니다 해당 매개 변수의 이름에 약간의 불일치가 있음을 볼 수 있습니까!

그래서
"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" 

는, yopu 날이 문제를 해결하거나 그렇게 이유를 설명하기 위해 도움이 될 수하십시오 는 내가이 명령은 여기에 예외는 전체 스택되어 발생하는 이유라고 생각? 생성 된 SQL을 수동으로 변경해야합니까? 나는 그것이 현재의 문제를 해결하기위한 좋은 선택이 아니라고 생각한다.

내가 다른 검색 식을 생성하기 위해 노력하고 여기 OrmLite 생산 ​​한 SQL입니다 오늘

업데이트 :

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) 

는 내가 무슨 일이 일어나고 있는지 이해할 수 없습니다. 우리는 이상한 이름의 매개 변수를보고 물론 q.Params 컬렉션에 이러한 이름을 가진 매개 변수가 없습니다 ...

답변

0

이것은 최신 버전에서 수정되었습니다 ...