0

文字列補間を使用してプレーン SQL クエリを実行するのに問題があります。Microsoft sqljdbc4.jar を使用して MS-SQL 2008 データベースにクエリを実行しようとしています。

表は単純です。

[serv_num]
number (nvarchar(15))  |  name (nvarchar(50))
=============================================
    1234               |     AA
    +345               |     BB

私が使用しているコードは次のとおりです。

import java.sql.{Connection, DriverManager}
import org.slf4j.LoggerFactory
import scala.collection.JavaConversions._
import scala.slick.session.Database
import Database.threadLocalSession
import scala.slick.jdbc.{GetResult, StaticQuery => Q}
import Q.interpolation

object NumImport extends App {
    def logger = LoggerFactory.getLogger("NumImport")
    implicit val getServNumResult = GetResult(r => ServNum(r.<<, r.<<))

    override def main(args: Array[String]) {
        val uri = "jdbc:sqlserver://192.168.1.2;databaseName=slicktestdb;user=yyyy;password=xxxxxx"
        val drv = "com.microsoft.sqlserver.jdbc.SQLServerDriver"

        Database.forURL(uri, driver = drv) withSession {
           def getServNum(n: String) = sql"select number, name from serv_num where number = $n".as[ServNum]
           val result = getServNum("1234")
           println(result.firstOption)
        }
    }

    case class ServNum(num: String, name: String)
}

私の問題は、私がjava.lang.NullPointerExceptionオンになっていることですresult.firstOption(私は思う!)。これは、行が見つかったときに発生します。存在しない数字を選択しようとすると、たとえば、getServNum("34")予想どおり になります。result.firstOptionNone

スタックトレース:

08:54:47.932 TKD [run-main] DEBUG scala.slick.session.BaseSession - Preparing statement: select number, name from serv_num where number = ?
[error] (run-main) java.lang.NullPointerException
java.lang.NullPointerException
at scala.slick.jdbc.StaticQuery.extractValue(StaticQuery.scala:16)
at scala.slick.jdbc.StatementInvoker$$anon$1.extractValue(StatementInvoker.scala:37)
at scala.slick.session.PositionedResultIterator.foreach(PositionedResult.scala:212)
at scala.slick.jdbc.Invoker$class.foreach(Invoker.scala:91)
at scala.slick.jdbc.StatementInvoker.foreach(StatementInvoker.scala:10)
at scala.slick.jdbc.Invoker$class.firstOption(Invoker.scala:41)
at scala.slick.jdbc.StatementInvoker.firstOption(StatementInvoker.scala:10)
at scala.slick.jdbc.UnitInvoker$class.firstOption(Invoker.scala:148)
at scala.slick.jdbc.StaticQuery0.firstOption(StaticQuery.scala:95)

スタックトレースをデバッグして追跡しようとしましたが、Scala と Slick の両方にまったく慣れていないため、道に迷っています。誰かが私を助けてくれたり、正しい方向に向けてくれたりしたら、とても感謝しています。

ありがとう。

4

1 に答える 1