SQL Server 2008 で CustomType などの UDT (ユーザー定義型) を宣言しました。このデータ型をストアド プロシージャの IN パラメータとして使用しています。このプロシージャを Java クラスから呼び出したいと考えています。これを行うために、次のことを行いました。
SQLData を実装する CustomType というクラスを作成しました
public class CustomType implements SQLData {
String name ;
int year ;
String sql_type = "CustomType_t";
public String getSQLTypeName() throws SQLException {
return sql_type;
}
public void readSQL(SQLInput arg0, String type) throws SQLException {
sql_type = type;
name = arg0.readString() ;
year = arg0.readInt() ;
}
public void writeSQL(SQLOutput arg0) throws SQLException {
arg0.writeString(name) ;
arg0.writeInt(year) ;
}
}
私のメインの Java クラスは次のようになります。
public class Proc2Test {
public static void main(String[] args) {
msmsqlTest() ;
}
public static void msmsqlTest()
{
Connection con = null ;
CallableStatement cStatement = null ;
ResultSet rs = null ;
String url = "jdbc:sqlserver://localhost:1433;databaseName=testDB;username=abc;password=xyz";
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
try
{
Class.forName(driver);
con = DriverManager.getConnection(url);
java.util.Map map = con.getTypeMap();
map.put("CustomType",
Class.forName("com..test.CustomType"));
con.setTypeMap(map);
cStatement = con.prepareCall("{call abc2(?,?)}") ;
CustomType x = new CustomType() ;
x.name = "ABC" ;
x.year = 20 ;
cStatement.setObject("para1", x, java.sql.Types.OTHER);
cStatement.registerOutParameter(2,Types.INTEGER) ;
rs = cStatement.executeQuery();
}
catch(Exception ex)
{
ex.printStackTrace() ;
}
}
}
このコードを実行すると、次の例外が発生します。
com.microsoft.sqlserver.jdbc.SQLServerException: This operation is not supported.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.NotImplemented(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.setTypeMap(Unknown Source)
at com.mindcraft.test.Proc2Test.msmsqlTest(Proc2Test.java:97)
at com.mindcraft.test.Proc2Test.main(Proc2Test.java:22)
この例外は con.setTypeMap(map) で発生します
私の問題は、入力パラメーターがカスタム データベース タイプである SQL Server のストアド プロシージャをどのように呼び出すかということです。POJO を SQL Server 2008 のカスタム データベース タイプにマップし、それをストアド プロシージャに送信するにはどうすればよいですか? SQL Server 2008 JDBC ドライバーはConnection.setTypeMap()
メソッドを実装していますか?