<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Junky's IT Notebook

    統(tǒng)計

    留言簿(8)

    積分與排名

    WebSphere Studio

    閱讀排行榜

    評論排行榜

    利用 JdbcTemplate 自動返回 MS SQL SERVER 2005 自增主鍵值

    JDBC3 中可以直接獲取當(dāng)前插入記錄的 ID 值,具體的調(diào)用方式如下:

    Statement stmt = conn.createStatement();
    stmt.executeUpdate(
    "INSERT INTO authors (first_name, last_name) values
     (′George′, ′Orwell′)
    ", Statement.RETURN_GENERATED_KEYS);
    ResultSet rs 
    = stmt.getGeneratedKeys();
    if ( rs.next() ) {
        
    int key = rs.getInt();
    }

    由于實際與數(shù)據(jù)庫交互采用的是 JdbcTemplate,因而需要找到它對這種方式的支持。經(jīng)過實際的查看 Spring 的 API 發(fā)現(xiàn)其本身提供相應(yīng)的方法支持,經(jīng)過多次的實驗后得到如下的實現(xiàn)方法:

    private void insert(final Profile profile){
        
    final String _save = "insert into Newsletter_Profile (user_id, publication_id, last_update) values (?, ?, getdate())";
        JdbcTemplate template 
    = this.getJdbcTemplate();
        KeyHolder keyHolder 
    = new GeneratedKeyHolder();
        template.update(
    new PreparedStatementCreator() {
            
    public PreparedStatement createPreparedStatement(Connection con)
             
    throws SQLException {
                            
    int i = 0;
                            PreparedStatement ps 
    = con.prepareStatement(_save,
                 Statement.RETURN_GENERATED_KEYS);
                            ps.setInt(
    ++i, profile.getCustomerId().intValue());
                            ps.setInt(
    ++i, profile.getPublication().getId());
                            
    return ps;
                      }

                }
    , keyHolder);
                profile.setId(keyHolder.getKey().intValue());
          }
     

    特別需要注意的地方是Statement.RETURN_GENERATED_KEYS,在使用MS SQL Server 2005 提供的 JDBC Driver 中上面的部分是必須的。之所以這么說是因為 google 出來的所有資料都是沒有該部分的,甚至 Spring 自身的 document 中也是沒有該參數(shù)的。我現(xiàn)在不知道那些代碼是否能夠真正的獲取到 Key,但是現(xiàn)在我 suppose 它們是可以 run 的。

    如果沒有加入 Statement.RETURN_GENERATED_KEYS  ,在實際進(jìn)行數(shù)據(jù)庫操作時會出現(xiàn)如下的異常:
    PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; The statement must be executed before any results can be obtained.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained.
    caused by : com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained.
    org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; The statement must be executed before any results can be obtained.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained.
    Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getGeneratedKeys(Unknown Source)
    at weblogic.jdbc.wrapper.PreparedStatement_com_microsoft_sqlserver_jdbc_SQLServerPreparedStatement.getGeneratedKeys(Unknown Source)
    at org.springframework.jdbc.core.JdbcTemplate$3.doInPreparedStatement(JdbcTemplate.java:772)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:527)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:767)
    at com.fdc.reports20.dao.NewsletterDAO.insert(NewsletterDAO.java:179)
    at com.fdc.reports20.dao.NewsletterDAO.save(NewsletterDAO.java:153)
    at com.fdc.reports20.dao.NewsletterDAO.update(NewsletterDAO.java:138)
    at com.fdc.reports20.business.service.user.AlertServiceImpl.updateNewsletter(AlertServiceImpl.java:146)
    at com.fdc.reports20.business.service.user.AlertServiceImpl$$FastClassByCGLIB$$52b80fbc.invoke()
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:674)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:154)
    at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:52)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)
    at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:53)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:615)
    at com.fdc.reports20.business.service.user.AlertServiceImpl$$EnhancerByCGLIB$$a12ee5d8.updateNewsletter()
    at com.fdc.reports20.web.delegate.AlertBD.updateNewsletter(AlertBD.java:78)
    at com.fdc.reports20.web.jpf.um.workbench.WorkBenchController.editPublicationEmails(WorkBenchController.java:149)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    posted on 2007-07-11 13:54 junky 閱讀(3926) 評論(0)  編輯  收藏 所屬分類: SQL Server

    主站蜘蛛池模板: 亚洲精品国产综合久久久久紧| 亚洲人成网站色在线观看| 57pao国产成视频免费播放| 亚洲精品永久在线观看| 久久久精品国产亚洲成人满18免费网站| a级毛片免费完整视频| 亚洲香蕉久久一区二区三区四区| 免费v片在线观看| 免费成人在线视频观看| 久久亚洲国产最新网站| 亚洲情XO亚洲色XO无码| 男人的好看免费观看在线视频| 国产A∨免费精品视频| 国产亚洲sss在线播放| 亚洲色精品aⅴ一区区三区 | 一二三四在线播放免费观看中文版视频| 亚洲Aⅴ在线无码播放毛片一线天| 亚洲日产韩国一二三四区| 在线观看免费为成年视频| 免费国产叼嘿视频大全网站 | 免费一级毛片在线播放视频| 亚洲欧美国产国产综合一区| 亚洲AV无码一区东京热久久| 国产又大又粗又硬又长免费| 在线观看的免费网站无遮挡| 一级毛片免费全部播放| 亚洲中文无码卡通动漫野外 | 麻豆亚洲AV成人无码久久精品| 久久亚洲精品国产精品| 亚洲综合久久夜AV | 日韩电影免费在线观看视频 | 久久精品国产精品亚洲| 免费无码又爽又刺激高潮 | 无码人妻精品一二三区免费| 免费看无码特级毛片| 特级毛片aaaa级毛片免费| 亚洲AV无码男人的天堂| 久久久久se色偷偷亚洲精品av| 亚洲av网址在线观看| 亚洲精品乱码久久久久久| 亚洲AⅤ无码一区二区三区在线|