如何从Java将表值参数传递到SQL Server存储过程?

11

我有一个Student类,具有以下属性:

Name, Department, Address, Grade. 

现在我有一个包含一些Student对象的ArrayList,就像这样,

List<Student> stuList = new ArrayList<Student>();
stuList.add(new Student("Tom","Comp", "123 street", "A"));
stuList.add(new Student("Jery","Comp", "456 street", "A+"));
stuList.add(new Student("Mac","Maths", "Dum Street", "B"));

我需要将这个ArrayList传递给SQL Server存储过程,并将学生对象数据插入表中。如何在Java中最好地实现这一点?我需要使用存储过程。

如果有用的话,Java版本为8,Sql Server版本为2014。


https://social.msdn.microsoft.com/Forums/sqlserver/en-US/f7377f1c-f235-4870-b4a9-eab041fbd7b5/is-tablevalued-parameters-available-in-java-jdbc?forum=sqldatabaseengine - Sean Lange
1
请参阅 https://blogs.technet.microsoft.com/dataplatforminsider/2016/04/04/preview-the-microsoft-jdbc-driver-6-0-for-sql-server/ 和 https://msdn.microsoft.com/en-us/library/mt651781.aspx。请注意,这需要 SQL Server JDBC 6.0 预览版驱动程序。 - Mark Rotteveel
1个回答

17

Mark Rotteveel 提供的输入下,我成功地完成了它。感谢 Mark,Sean 也感谢您的帮助。这是可供您们参考的工作代码。

String jdbcurl = "jdbc:sqlserver://TestServer:1433;DatabaseName=Student";
connection = DriverManager.getConnection(jdbcurl,"username","password");

SQLServerDataTable stuTypeDT = new SQLServerDataTable(); 
stuTypeDT.addColumnMetadata("StudentId", java.sql.Types.NUMERIC);
stuTypeDT.addColumnMetadata("Name", java.sql.Types.VARCHAR);
stuTypeDT.addColumnMetadata("Department", java.sql.Types.VARCHAR);
stuTypeDT.addColumnMetadata("Address", java.sql.Types.VARCHAR);

stuTypeDT.addRow("1","Tom", "A", "123 Street");
stuTypeDT.addRow("2","Jery", "B", "456 Street");
stuTypeDT.addRow("3","Mac", "C", "Vancour");

String ececStoredProc = "EXEC InsertStudentInfo ?";
SQLServerPreparedStatement pStmt = (SQLServerPreparedStatement)connection.prepareStatement(ececStoredProc);
pStmt.setStructured(1, "dbo.StudentInfoType", stuTypeDT);
pStmt.execute();

微软在其6.0预览版的Apr-1发布中添加了此功能,可在此处下载:https://www.microsoft.com/en-us/download/details.aspx?id=11774 - nirmal
作为将 PreparedStatement 强制转换的替代方法,您可以将 SQLServerDataTable 实例传递给 PreparedStatement.setObject(int,Object) 方法。这对于在 dbo 模式中定义的 TVP 类型有效。 - allenru
SQLServerDataTable不再作为驱动程序下载的一部分提供。 - Finni McFinger
1
@FinniMcFinger 在 MS 驱动程序包中有几个 jar 文件。你确定你在正确的地方查找吗?我刚从 MS 网站重新下载了它,并验证了该类在 jar 文件中。你必须选择 MS JDBC 驱动程序 6.0 版本。然后网站会要求你选择一个文件,我选择了 sqljdbc_6.0.7507.100_enu.tar.gz。一旦下载完成,在该存档中我只使用了 sqljdbc42.jar。 - allenru
com.microsoft.sqlserver.jdbc.SQLServerException: 不允许在表变量上插入标识列。 - srinivas gowda
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接