0

部分的に適用された関数を使用して、scala でデータベース呼び出しの周りに便利なラッパーを作成しようとしています。

  def queryResult[B](connection: Connection, sql: String)(process: (CallableStatement,ResultSet) => B): B =
    using (connection) { connection =>
      using (connection.prepareCall(sql)) { statement =>
        var rs: ResultSet = null
        try {
          process(statement, rs)
        } finally if (rs != null) {
          try {
            rs.close()
          }
          catch {
            case e: SQLException => {}
          }
        }
      }
    }

主に接続/結果セットを自動的に閉じるため。rsただし、変数を val ではなく var として返したいと思います。クエリからの結果セットに rs を割り当てようとすると、val に再割り当てできないというエラーが表示されます。

または、ストリーム/接続を開閉するためのコードの再利用を最大化する他の方法がある場合は、それも共有してください。

編集: Randall Schulz が述べたように、Scala ARMは実際の問題に対処します。ただし、投稿した質問は Scala ではサポートされていません。

4

1 に答える 1

3

あなたが望んでいるように見えるのは、あまり一般的な機能のプログラミング言語ではない参照渡しと呼ばれるものです。Scala はサポートしていません。

この場合、単に "process" が ResultSet を引数として受け取る代わりに ResultSet を返すようにします。

def queryResult[B](connection: Connection, sql: String)(process: CallableStatement => (ResultSet, B)): (ResultSet, B) =
    using (connection) { connection =>
      using (connection.prepareCall(sql)) { statement => {
          val (rs, result) = process(statement)
          if (rs != null) 
             try rs.close
             catch {
               case _ : SQLException =>
             }
          result
       }
     }
   }
于 2013-01-11T20:44:35.177 に答える