如何将用户定义的表类型从Java传递给MYSQL请求

时间:2012-02-21 10:04:10

标签: java sql sql-server-2008 stored-procedures

给定一个简单的存储过程,该过程具有一个带有单个整数列作为参数的表:

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
}

3 个答案:

答案 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团队仍在努力解决这个问题。请参阅链接:

访问:http://blogs.msdn.com/b/jdbcteam/archive/2012/04/03/how-would-you-use-table-valued-parameters-tvp.aspx

尝试一些替代解决方案,而不是通过在过程体中传递XML参数和OPENXML()来使用TVP。