Slick:更新SQLServer / jtds上的字段

时间:2014-07-08 11:53:23

标签: scala slick

我正在尝试使用Slick 2.0更新字段并通过jtds驱动程序连接到SQL Server

表:

object UtilisateurSchema {

    class UtilisateurId(val value: Long) extends MappedTo[Long]

    case class Utilisateur(id: Option[UtilisateurId], nom: String, prenom: String)

    class Utilisateurs(tag: Tag) extends Table[Utilisateur](tag, "UTILISATEUR") {
        def id = column[UtilisateurId]("UTL_ID", O.PrimaryKey, O.AutoInc)
        def nom = column[String]("UTL_NOM")
        def prenom = column[String]("UTL_PRENOM")

        // Defaut projection
        def * = (id.?, nom, prenom) <>(Utilisateur.tupled, Utilisateur.unapply _)

    }
    val utilisateurs = TableQuery[Utilisateurs]
}

我的表中有一位用户,其ID为1331

下面的代码给了我一个例外:

val user = utilisateurs filter (  _.id === new UtilisateurId(1331L))
println(user first)
val newUser = user first() copy( nom = "Foo")
println(newUser)
user update(newUser)

例外是:

Exception in thread "main" java.sql.SQLException: Impossible de mettre à jour la colonne identité 'UTL_ID'.
    at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)
    at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632)
    at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:584)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:546)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:506)
    at scala.slick.driver.JdbcInvokerComponent$UpdateInvoker$$anonfun$update$1.apply(JdbcInvokerComponent.scala:282)
    at scala.slick.driver.JdbcInvokerComponent$UpdateInvoker$$anonfun$update$1.apply(JdbcInvokerComponent.scala:277)
    at scala.slick.jdbc.JdbcBackend$SessionDef$class.withPreparedStatement(JdbcBackend.scala:161)
    at scala.slick.jdbc.JdbcBackend$BaseSession.withPreparedStatement(JdbcBackend.scala:297)
    at scala.slick.driver.JdbcInvokerComponent$UpdateInvoker.update(JdbcInvokerComponent.scala:277)
    at com.sqlconnect.SqlPlayground$$anonfun$main$1.apply(SqlPlayground.scala:100)
    at com.sqlconnect.SqlPlayground$$anonfun$main$1.apply(SqlPlayground.scala:37)
    at scala.slick.backend.DatabaseComponent$DatabaseDef$class.withSession(DatabaseComponent.scala:31)
    at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$4.withSession(JdbcBackend.scala:61)
    at com.sqlconnect.SqlPlayground$.main(SqlPlayground.scala:36)
    at com.sqlconnect.SqlPlayground.main(SqlPlayground.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Impossible de mettre à jour la colonne identité 'UTL_ID'表示:

Impossible to update identity column 'UTL_ID'

我在家里做了一些测试,连接到MySQL驱动程序和上面的更新工作方式

另一方面,使用以下代码适用于MSSQL + jtds:

val nom = for ( u <- utilisateurs if u.id === new UtilisateurId(1331L)) yield u.nom
nom.update("Foo")

有谁可以解释我在第一种情况下做错了什么?或者这是一个错误?

干杯

1 个答案:

答案 0 :(得分:1)

它与您的代码或驱动程序无关; SQL Server不允许简单地编辑IDENTITY列;你必须使用identity insert mode

即使这有缺点:您一次只能在会话中的一个表上启用标识插入。

我没有使用SQL Server的光滑,但如果它不够聪明,不能单独保留主键,则可能必须创建自己的更新方法。

另请注意,光滑需要商业许可证才能与SQL Server一起使用,可能意味着。作为closed-source package

的一部分提供了正确的SQL Server支持