首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

要把数据插入到多张表?该如何处理

2012-01-26 
要把数据插入到多张表?我有个问题:我要把一条数据插入3张表中,如何控制插入出错时全部回滚,我现在的代码是

要把数据插入到多张表?
我有个问题:我要把一条数据插入3张表中,如何控制插入出错时全部回滚,我现在的代码是这样的:
                            PreparedStatement   pstmt   =   con.prepareStatement(
                                                "insert   into   Xz_jbxxb(xz_id,xx_id,xk_id,xz_cxrq,dc_id,xz_cxc,xz_zt)   values   (?,?,?,?,?,?,?) ");
                                pstmt.setString(1,   (String)   listxh.get(i));
                                pstmt.setString(2,   (String)   listzyxxx.get(1));
                                pstmt.setString(3,   (String)   listzyxxx.get(2));
                                pstmt.setString(4,   (String)   listzyxxx.get(3));
                                pstmt.setString(5,   (String)   listzyxxx.get(4));
                                pstmt.setString(6,   (String)   listzyxxx.get(5));
                                pstmt.setString(7,   "ZYX ");
                                pstmt.execute();
                                pstmt.clearParameters();
                                pstmt   =   con.prepareStatement(
                                                "insert   into   Xz_zyx(xz_id,xz_zt,xz_cbj,xz_dcf,xz_qtfy,xz_zjj,xz_czjg,dt_id)   values   (?,?,?,?,?,?,?,?) ");
                                pstmt.setString(1,   (String)   listxh.get(i));
                                pstmt.setString(2,   "ZYX ");
                                pstmt.setFloat(3,     Float.parseFloat((String)listzyxxx.get(6)));
                                pstmt.setFloat(4,     Float.parseFloat((String)   listzyxxx.get(8)));
                                pstmt.setFloat(5,     Float.parseFloat((String)   listzyxxx.get(9)));
                                pstmt.setFloat(6,     Float.parseFloat((String)   listzyxxx.get(7)));
                                pstmt.setFloat(7,     Float.parseFloat((String)   listzyxxx.get(10)));


                                pstmt.setString(8,   "dt002 ");     //动态
                                pstmt.execute();
                                pstmt.clearParameters();
                                pstmt   =   con.prepareStatement(
                                                "insert   into   dcxzxx(xz_id,dc_id)   values   (?,?) ");
                                pstmt.setString(1,   (String)   listxh.get(i));
                                pstmt.setString(2,   (String)   listzyxxx.get(4));
                                pstmt.execute();
比如要执行到第2个SQL语句时出错,但第一个SQL语句已经执行,数据已经插进去了.

[解决办法]
用事务。
[解决办法]
用sql中的事务。

[解决办法]
贴个例子给lz,一看就明白:
***************************************

public class OrderHandler extends HttpServlet {

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType( "text/plain ");
PrintWriter out = res.getWriter();

Connection con = null;
try {
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver ");
con = DriverManager.getConnection( "jdbc:odbc:ordersdb ", "user ", "passwd ");

// Turn on transactions
con.setAutoCommit(false);

Statement stmt = con.createStatement();
stmt.executeUpdate(
"UPDATE INVENTORY SET STOCK = (STOCK - 10) WHERE PRODUCTID = 7 ");
stmt.executeUpdate(
"UPDATE SHIPPING SET SHIPPED = (SHIPPED + 10) WHERE PRODUCTID = 7 ");

chargeCard(); // method doesn 't actually exist...

con.commit();
out.println( "Order successful! Thanks for your business! ");
}
catch (Exception e) {
// Any error is grounds for rollback
try {
con.rollback();
}
catch (SQLException ignored) { }
out.println( "Order failed. Please contact technical support. ");
}
finally {
// Clean up.
try {
if (con != null) con.close();
}
catch (SQLException ignored) { }
}
}
}

[解决办法]
事务控制
con.setAutocommit(false)
try
{
...
con.commit();
}
catch(Exception e)
{
con.rollback();
}
finally
{
con.close();
}

热点排行