给定一个简单的存储过程,该过程具有一个带有单个整数列作为参数的表:
CREATE PROCEDURE [dbo].[table_sel]
@tbl INT32Table READONLY
AS
BEGIN
SET NOCOUNT ON;
SELECT value FROM @tbl
END
如何从Java执行此存储过程?从C#开始,这就是我想要的:
SqlConnection sqlconn;
System.Data.DataTable tbl = new System.Data.DataTable("INT32Table", "dbo");
tbl.Columns.Add("value", typeof(int));
tbl.Rows.Add(2);
tbl.Rows.Add(3);
tbl.Rows.Add(5);
tbl.Rows.Add(7);
tbl.Rows.Add(11);
using (SqlCommand command = new SqlCommand("table_sel"))
{
command.Connection = sqlconn;
command.Parameters.AddWithValue("@tbl", tbl);
command.CommandType = System.Data.CommandType.StoredProcedure;
SqlDataReader reader = command.ExecuteReader();
//do stuff
}
答案 0 :(得分:1)
哦对不起, 据我所知,Java中没有这样的表对象,你可以使用cs.setObject()但是你应该再从某个地方获取该对象(在mssql服务器上查询?)。 如果您正在寻找使用JDBC的插入的性能,那么您应该考虑prepareStatements和批处理执行。
java.sql.connection connection = //driver, url, database, credentials ...
try
{
PreparedStatement ps =
connection.prepareStatement("insert into tbl values (?)");
ps.setInt(1, your 1st int);
ps.addBatch();
ps.setInt(1, your 2nd int);
ps.addBatch();
ps.setInt(1, your 3rd int);
ps.addBatch();
ps.executeBatch();
}
catch (SQLException e)
{
// err handling goes here
}
finally
{
// close your resources
}
此致 小号
答案 1 :(得分:0)
在Java中,您应该使用CallableStatement。 例如
java.sql.connection connection = //driver, url, database, credentials ...
try
{
CallableStatement cs =
connection.prepareCall("{ call table_sel(?) }");
cs.setInt(1, your int);
cs.execute();
}
catch (SQLException e)
{
// err handling goes here
}
finally
{
// close your ressources
}
此致 小号
答案 2 :(得分:0)
你无法使用JDBC传递TVP。正如他们2年前提到的那样,Microsoft JDBC团队仍在努力解决这个问题。请参阅链接:
尝试一些替代解决方案,而不是通过在过程体中传递XML参数和OPENXML()来使用TVP。