SQL jdbc解決自動自動成長列統一處理問題紀實

來源:互聯網
上載者:User
sql|解決|問題

sql server2005 jdbc解決自動自動成長列統一處理問題紀實

作者fbysss
msn:jameslastchina@hotmail.com 
blog:blog.csdn.net/fbysss
聲明:本文由fbysss原創,轉載請註明出處
關鍵字:自動成長列,jdbc,sqlserver2005

背景:系統要支援多種資料庫,統一insert的時候擷取自動成長列的處理方式
問題1:insert+select方案
sqlserver2000可以使用insertSql  + SELECT @@IDENTITY AS 'Identity'的方式來獲得,
但是mysql則只能使用executeUpdate(insertSql); executeQuery('SELECT last_insert_id() ')這樣的方式,否則會拋出異常:java.sql.SQLException: Can not issue data manipulation statements with executeQuery()
而兩句話分開處理,總讓人感覺不放心,如果並行作業比較多,存在潛在的危險
問題2:getGeneratedKeys方案
mysql的驅動支援jdbc3.0,實現了getGeneratedKeys()
但sqlserver2000 jdbc驅動不支援getGeneratedKeys()
解決思路:
google了一下,據說2005是支援的,所以下下來看看
下載地址:url:http://download.microsoft.com/download/2/8/9/289dd6a3-eeeb-46dc-9045-d0c6b59bfbc1/sqljdbc_1.1.1501.101_chs.exe
使用小結:
1.2005jdbc驅動是支援jdbc 3.0 的。也就是說,的確支援getGeneratedKeys()方法。
2.2005jdbc驅動url和包組織變動較大。
舉例對比:(請仔細看好了,一不小心看不出差別!)
================
2000
================
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb;SelectMethod=cursor"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
================
2005
================
url="jdbc:sqlserver://localhost:1433;DatabaseName=mydb;SelectMethod=cursor"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
如果沒注意這點,必將出現異常:Cannot load JDBC driver class'com.microsoft.jdbc.sqlserver.SQLServerDriver'
做好第二步,出現
3.包的位置:環境變數CLASSPATH不是必須的。但sqljdbc.jar必須放置在tomcat/common/lib中(如果是租用空間,可能得跟對方商量了,看是否支援2005的驅動)。
否則會發生異常:Cannot load JDBC driver class'com.microsoft.sqlserver.jdbc.SQLServerDriver'

測試樣本方法:

    public  String executeUpdate(String sql) throws    SQLException ...{
        Connection conn = getConnection();
        PreparedStatement pstmt = null;
        try ...{
            /**//*注意:jdbc3.0提供了Statement.RETURN_GENERATED_KEYS"用來指明需要從Statement中獲得自動成長列值,
            如果不設定該參數,在執行getGeneratedKeys()時會拋出異常:"只有運行該語句,產生的鍵才會可用。"*/
            pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            pstmt.executeUpdate();
            ResultSet rs =  pstmt.getGeneratedKeys();//為了insert準備
            if (rs.next())...{
             return rs.getString(1);
            }
            return "-1";
        } catch (SQLException ex) ...{
                throw new SQLException(
                                          "執行SQL語句失敗。" +
                                          ex.toString() +
                                          "  sql:"+sql);
        } finally ...{
            freeConnection(conn,pstmt);
        }
    }



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。