IsNullOrEmptyにnullを渡すとNullReferenceExceptionが出る

Jul 9, 2011 at 1:09 AM

以下のようなコードを試してみたらNullReferenceExceptionが起きました。
nullを渡している箇所を空白文字にしたら大丈夫でした。

 

let printEmps emps =
    emps
        |> Seq.iter (fun e -> printfn "%d %s" e.ID e.Name)

let queryExpression config con =
    let query = @"
        select
            *
        from
            Employees
        where
        /*% if not (isNullOrEmpty emp) */
            Name like /* contains emp */'test' escape '$'
        /*% end */"

    let emps = LocalDb.query config con query ["emp" @= "二" ]
    printEmps emps

    let emps = LocalDb.query config con query ["emp" @= null]
    printEmps emps
スタックトレース
ハンドルされていない例外: System.NullReferenceException: オブジェクト参照がオブ
ジェクト インスタンスに設定されていません。
   場所 Soma.Core.ExpressionModule.applyApplication(Location loc, Object func, T
ype funcType, Object arg, Type argType) 場所 C:\soma\Soma.Core\Expression.fs:行
482
   場所 Soma.Core.ExpressionModule.visitExpression@499(IDictionary`2 exprCtxt, E
xpression _arg1) 場所 C:\soma\Soma.Core\Expression.fs:行 516
   場所 Soma.Core.ExpressionModule.visitExpression@499(IDictionary`2 exprCtxt, E
xpression _arg1) 場所 C:\soma\Soma.Core\Expression.fs:行 510
   場所 Soma.Core.ExpressionModule.generate(String expr, IDictionary`2 exprCtxt,
 Expression expression) 場所 C:\soma\Soma.Core\Expression.fs:行 579
   場所 Soma.Core.ExpressionModule.evaluate(String expr, IDictionary`2 exprCtxt,
 Func`2 parser) 場所 C:\soma\Soma.Core\Expression.fs:行 583
   場所 Soma.Core.SqlModule.eval(IDbConfig config, IDictionary`2 exprCtxt, Strin
g expr, Location loc, String sql) 場所 C:\soma\Soma.Core\Sql.fs:行 275
   場所 Soma.Core.SqlModule.eval@393.Invoke(String expr, Location loc) 場所 C:\s
oma\Soma.Core\Sql.fs:行 393
   場所 Soma.Core.SqlModule.|If|_|[a](IfComment ifComment, FSharpFunc`2 eval, a
_arg6) 場所 C:\soma\Soma.Core\Sql.fs:行 251
   場所 Soma.Core.SqlModule.visitNode@310.Invoke(State state, Node _arg3) 場所 C
:\soma\Soma.Core\Sql.fs:行 392
   場所 Microsoft.FSharp.Collections.ListModule.loop@144-20[T,TState](FSharpFunc
`3 f, TState s, FSharpList`1 xs)
   場所 Microsoft.FSharp.Collections.ListModule.Fold[T,TState](FSharpFunc`2 fold
er, TState state, FSharpList`1 list)
   場所 Soma.Core.SqlModule.visitNode@310.Invoke(State state, Node _arg3) 場所 C
:\soma\Soma.Core\Sql.fs:行 336
   場所 Microsoft.FSharp.Collections.ListModule.loop@144-20[T,TState](FSharpFunc
`3 f, TState s, FSharpList`1 xs)
   場所 Microsoft.FSharp.Collections.ListModule.Fold[T,TState](FSharpFunc`2 fold
er, TState state, FSharpList`1 list)
   場所 Microsoft.FSharp.Collections.ListModule.loop@144-20[T,TState](FSharpFunc
`3 f, TState s, FSharpList`1 xs)
   場所 Microsoft.FSharp.Collections.ListModule.Fold[T,TState](FSharpFunc`2 fold
er, TState state, FSharpList`1 list)
   場所 Microsoft.FSharp.Collections.ListModule.loop@144-20[T,TState](FSharpFunc
`3 f, TState s, FSharpList`1 xs)
   場所 Microsoft.FSharp.Collections.ListModule.Fold[T,TState](FSharpFunc`2 fold
er, TState state, FSharpList`1 list)
   場所 Soma.Core.SqlModule.generate(IDbConfig config, String sql, IDictionary`2
 exprCtxt, Statement statement) 場所 C:\soma\Soma.Core\Sql.fs:行 294
   場所 Soma.Core.SqlModule.prepareCore(IDbConfig config, String sql, IDictionar
y`2 exprCtxt, Func`2 parser) 場所 C:\soma\Soma.Core\Sql.fs:行 435
   場所 Soma.Core.DbImpl.QueryOnDemand[T](String sql, IDictionary`2 exprCtxt) 場
所 C:\soma\Soma.Core\Db.fs:行 492
   場所 Soma.Core.LocalDbModule.query[T](IDbConfig config, DbConnection connecti
on, String sql, FSharpList`1 condition) 場所 C:\soma\Soma.Core\Db.fs:行 1578
   場所 Program.queryExpression(IDbConfig config, DbConnection con) 場所 C:\User
s\****\documents\visual studio 2010\Projects\Okazuki.SomaEducation2\Okazuki.So
maEducation2\Program.fs:行 56
   場所 Program.main(String[] args) 場所 C:\Users\****\documents\visual studio
 2010\Projects\Okazuki.SomaEducation2\Okazuki.SomaEducation2\Program.fs:行 75
Coordinator
Jul 9, 2011 at 8:09 AM
Edited Jul 9, 2011 at 8:09 AM

報告ありがとうございます。

Somaのバグでした。

Soma 1.2.0.0 で修正しています。