Как передать табличные параметры из java в хранимую процедуру сервера sql?

У меня есть класс Student со следующими атрибутами:

Name, Department, Address, Grade. 

Теперь у меня есть ArrayList, который содержит несколько Student таких объектов,

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"));

Мне нужно передать этот массив в хранимую процедуру сервера sql и вставить данные объекта ученика в таблицу. Как лучше всего добиться этого в Java? Мне нужна хранимая процедура.

Java версии 8, Sql Server 2014, если это нужно.


person Umakanth    schedule 12.04.2016    source источник
comment
social.msdn.microsoft.com/Forums/sqlserver/en-US/   -  person Sean Lange    schedule 12.04.2016
comment
См. также blogs.technet.microsoft.com/dataplatforminsider/2016/04/04/ и msdn.microsoft.com/en-us/library/mt651781.aspx Обратите внимание, что для этого требуется драйвер SQL Server JDBC 6.0 Preview(!)   -  person Mark Rotteveel    schedule 13.04.2016


Ответы (1)


Благодаря информации, предоставленной Mark Rotteveel, я смог это сделать. Спасибо, Марк, Шон, также спасибо за ваш вклад. Вот рабочий код для любого из вас, который может найти его полезным.

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();
person Umakanth    schedule 14.04.2016
comment
MS добавила эту функцию в выпуск 6.0 от 1 апреля, доступный здесь: microsoft.com/en-us/download/details.aspx?id=11774 - person nirmal; 22.06.2016
comment
В качестве альтернативы приведению PreparedStatement можно передать экземпляр SQLServerDataTable методу PreparedStatement.setObject(int,Object). Это работало для типа TVP, определенного в схеме dbo. - person allenru; 15.07.2016
comment
Таблица SQLServerDataTable больше не доступна в составе загружаемого драйвера. - person Finni McFinger; 12.09.2016
comment
@FinniMcFinger В пакете драйвера MS есть несколько банок. Вы уверены, что ищете в правильном месте? Я только что повторно загрузил его с сайта MS и убедился, что класс находится в банке. Вы должны выбрать драйвер MS JDBC версии 6.0. Затем сайт просит вас выбрать файл, и я выбрал sqljdbc_6.0.7507.100_enu.tar.gz. После загрузки в этом архиве я использовал только sqljdbc42.jar. - person allenru; 03.10.2016
comment
@allenru Вы правы. Он находится в файле sqljdbc42.jar. Я искал в sqljdbc6.jar. Ваше здоровье! - person Finni McFinger; 03.10.2016
comment
com.microsoft.sqlserver.jdbc.SQLServerException: INSERT в столбец идентификаторов не разрешен для переменных таблицы. - person srinivas gowda; 18.09.2018
comment
То же самое касается Oracle? - person Faizan Mubasher; 02.03.2021