<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

    主站蜘蛛池模板: 亚洲最大av资源站无码av网址| 免费手机在线看片| 亚洲国产天堂在线观看| 91香蕉国产线在线观看免费 | 久久亚洲精品国产精品| 中文字幕影片免费在线观看| 亚洲AV网一区二区三区| 人人狠狠综合久久亚洲婷婷| 久久久久国产精品免费免费搜索| 视频免费1区二区三区| 久久精品亚洲精品国产色婷| 国产极品粉嫩泬免费观看| 免费在线看黄网站| 亚洲av无码无线在线观看| 亚洲AV无码一区二区乱子伦| 成年女人永久免费观看片| 国产午夜成人免费看片无遮挡| 亚洲AV成人一区二区三区在线看| 国产成人亚洲影院在线观看| 国产大片91精品免费观看不卡| 四虎影视永久在线精品免费| 亚洲人成影院在线高清| 亚洲综合熟女久久久30p| 24小时日本在线www免费的| 免费无码又爽又刺激一高潮| 色偷偷尼玛图亚洲综合| 亚洲白嫩在线观看| 国产精品亚洲A∨天堂不卡| 宅男666在线永久免费观看| 亚洲精品视频在线观看免费| 三上悠亚在线观看免费| 国产午夜亚洲精品不卡电影| 亚洲最大黄色网址| 国产亚洲av片在线观看16女人| 国产免费人视频在线观看免费| 亚洲视频免费在线播放| 美女视频黄a视频全免费网站色窝| 免费夜色污私人影院网站电影| 日本亚洲免费无线码 | 日韩在线天堂免费观看| xx视频在线永久免费观看|