使用sqlserver官方驅(qū)動(dòng)包調(diào)用存儲(chǔ)過(guò)程遇到的坑及解決方法
和外部系統(tǒng)做對(duì)接,對(duì)方提供了一個(gè)存儲(chǔ)過(guò)程,對(duì)方為sqlserver數(shù)據(jù)庫(kù),我方為oracle數(shù)據(jù)庫(kù)。
需求簡(jiǎn)單來(lái)說(shuō)就是調(diào)用對(duì)方的存儲(chǔ)過(guò)程獲得結(jié)果,轉(zhuǎn)儲(chǔ)到我方庫(kù),后續(xù)在對(duì)數(shù)據(jù)進(jìn)行處理。
我寫了個(gè)代碼片段做測(cè)試,用jdbc來(lái)調(diào)用對(duì)方的存儲(chǔ)過(guò)程,可是在調(diào)用后就直接報(bào)錯(cuò)了,錯(cuò)誤信息如下
com.microsoft.sqlserver.jdbc.SQLServerException: 該語(yǔ)句沒有返回結(jié)果集
我就不理解了,為啥用數(shù)據(jù)庫(kù)連接工具調(diào)就沒問(wèn)題呢?是有結(jié)果集的呀。
瘋狂找資料,找帖子。最后終于是找到了。
解決方法:
- 換驅(qū)動(dòng)包。對(duì)方數(shù)據(jù)庫(kù)是SQL server2008,我用的是 sqljdbc4-4.0 。直接換了第三方開源的SQL Server數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序 jtds1.2。問(wèn)題解決,調(diào)用存儲(chǔ)過(guò)程的時(shí)候不再出錯(cuò)。
- 在存儲(chǔ)過(guò)程首行添加 set nocount on (這個(gè)我沒實(shí)驗(yàn),因?yàn)榇鎯?chǔ)過(guò)程沒在我手里,操作不到)
最后記錄一段jdbc調(diào)用存儲(chǔ)結(jié)構(gòu)的代碼,一個(gè)參數(shù),返回結(jié)果集
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class Test { final static String SERVERURL = "jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=XXX"; final static String SERVERDriver = "net.sourceforge.jtds.jdbc.Driver"; final static String SERVERUSERNAME = "username"; final static String SERVERPASSWORD = "password"; public static void main(String[] args) { try { //調(diào)用存儲(chǔ)過(guò)程 Class.forName(SERVERDriver); Connection conn = DriverManager.getConnection(SERVERURL, SERVERUSERNAME, SERVERPASSWORD); System.out.println("sql server連接成功"); String call = "{call 存儲(chǔ)過(guò)程名稱(?)}"; CallableStatement callableStatement = conn.prepareCall(call); callableStatement.setString(1, "2022-10-13"); ResultSet rs = callableStatement.executeQuery(); while(rs.next()) { System.out.println(rs.getString("aaa")); System.out.println(rs.getString("bbb")); System.out.println(rs.getString("ccc")); System.out.println(rs.getString("ddd")); } callableStatement.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
到此這篇關(guān)于用sqlserver官方驅(qū)動(dòng)包調(diào)用存儲(chǔ)過(guò)程遇到的一個(gè)坑的文章就介紹到這了,更多相關(guān)sqlserver官方驅(qū)動(dòng)包調(diào)用存儲(chǔ)過(guò)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
還原sql server數(shù)據(jù)庫(kù)的處理方法
把數(shù)據(jù)庫(kù)的備份文件放到服務(wù)器的任意目錄下先, 然后按下面的步驟一步一步做。2013-03-03數(shù)據(jù)庫(kù)訪問(wèn)性能優(yōu)化
這篇文章主要介紹了數(shù)據(jù)庫(kù)訪問(wèn)性能優(yōu)化,小編總結(jié)了一些面向程序員的基本優(yōu)化法則,本文將結(jié)合實(shí)例來(lái)坦述數(shù)據(jù)庫(kù)開發(fā)的優(yōu)化知識(shí),需要的朋友可以參考下2015-08-08Sql Server 2016新功能之Row-Level Security(值得關(guān)注)
Sql Server 2016 有一個(gè)新功能叫 Row-Level Security 。下面通過(guò)實(shí)例給大家介紹Sql Server 2016新功能之Row-Level Security,感興趣的朋友一起看看吧2016-11-11數(shù)據(jù)庫(kù)表的創(chuàng)建、管理和數(shù)據(jù)操作(實(shí)驗(yàn)一)
這篇文章主要介紹了數(shù)據(jù)庫(kù)中表的創(chuàng)建、管理和數(shù)據(jù)操作,感興趣的小伙伴可以參考一下2015-08-08SQL?Server中row_number函數(shù)用法入門介紹
SQL?ROW_NUMBER函數(shù)是臨時(shí)值序列的非持久生成,并且在執(zhí)行查詢時(shí)會(huì)動(dòng)態(tài)計(jì)算該函數(shù),下面這篇文章主要給大家介紹了關(guān)于SQL?Server中row_number函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2023-03-03SQLSERVER ISNULL 函數(shù)與判斷值是否為空的sql語(yǔ)句
由于服務(wù)器設(shè)置不當(dāng)導(dǎo)致sqlserver的某個(gè)字段為空,導(dǎo)致部分內(nèi)容顯示失敗,所有這里需要將為空的字符替換為制定的字符2013-11-11MsSQL數(shù)據(jù)導(dǎo)入到Mongo的默認(rèn)編碼問(wèn)題(正確導(dǎo)入Mongo的方法)
今天進(jìn)行了一個(gè)實(shí)驗(yàn)來(lái)驗(yàn)證數(shù)據(jù)導(dǎo)入到mongo的效率問(wèn)題,但是期間出現(xiàn)了默認(rèn)編碼問(wèn)題,下面看一下正確的方法2013-11-11SQL SERVER使用ODBC 驅(qū)動(dòng)建立的鏈接服務(wù)器調(diào)用存儲(chǔ)過(guò)程時(shí)參數(shù)不能為NULL值
這篇文章主要介紹了SQL SERVER使用ODBC 驅(qū)動(dòng)建立的鏈接服務(wù)器調(diào)用存儲(chǔ)過(guò)程時(shí)參數(shù)不能為NULL值的相關(guān)資料,需要的朋友可以參考下2016-01-01