`
nishijia
  • 浏览: 53095 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个Connection带2个PreparedStatement的顺序问题

    博客分类:
  • JDBC
SQL 
阅读更多

遇到这么个问题,2个表:TB_PARENT(COL_ID,COL_NAME,COL_ADDRESS)

                                   TB_USER(COL_ID,COL_USERNAME,parentID)

 

TB_USER的 parentID 外键 到  TB_PARENT的COL_ID(主键)

 

先上代码:

 

	Connection conn = ConnectionPool.getConnection();// 获得数据库连接
		try {
			conn.setAutoCommit(false);
		} catch (SQLException e2) {
			e2.printStackTrace();
		}
		String sql="INSERT INTO TB_PARENT(COL_ID,COL_NAME,COL_ADDRESS) VALUES(?,?,?)";
		
		String sql2="INSERT INTO TB_USER(COL_ID,COL_USERNAME,parentID) VALUES(?,?,?)";
		PreparedStatement psmt=null,psmt2=null;
		try {
			psmt=conn.prepareStatement(sql);
			psmt.setInt(1, 201);
			psmt.setString(2, "parent1");
			psmt.setString(3, "shanghai");
			psmt.execute();
			
			psmt2=conn.prepareStatement(sql2);
			psmt2.setInt(1, 200);
			psmt2.setString(2, "nihao");
			psmt2.setInt(3, 201);
			psmt2.execute();
		
			conn.commit();
		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} finally{
			try {
				psmt.close();
				psmt2.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

 会报出  java.sql.SQLException: ORA-02291: 违反完整约束条件 (USERNAME.FK_T) - 未找到父项关键字

(USERNAME.FK_T)是这个外键名字

 

但是,我把 psmt 和 psmt2的执行的位置颠倒下 就可以插入了  没有任何报错

代码如下:

 

Connection conn = ConnectionPool.getConnection();// 获得数据库连接
		try {
			conn.setAutoCommit(false);
		} catch (SQLException e2) {
			e2.printStackTrace();
		}
		String sql="INSERT INTO TB_PARENT(COL_ID,COL_NAME,COL_ADDRESS) VALUES(?,?,?)";
		
		String sql2="INSERT INTO TB_USER(COL_ID,COL_USERNAME,parentID) VALUES(?,?,?)";
		PreparedStatement psmt=null,psmt2=null;
		try {
			
			psmt2=conn.prepareStatement(sql2);
			psmt2.setInt(1, 200);
			psmt2.setString(2, "nihao");
			psmt2.setInt(3, 201);
			psmt2.execute();
		
			psmt=conn.prepareStatement(sql);
			psmt.setInt(1, 201);
			psmt.setString(2, "parent1");
			psmt.setString(3, "shanghai");
			psmt.execute();
			conn.commit();
		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} finally{
			try {
				psmt.close();
				psmt2.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
 

想不通啊 为什么? 难道在一个connection 提交前越晚执行的语句越早被提交吗?一般不是先插入被外键关联的数据,再插入本数据么

 

后来我把那个constraint取消掉,2段代码 都不报错了 ,很想知道原因 能人来解答下吧

 

 

 

 

0
0
分享到:
评论
3 楼 illu 2010-02-04  
=.= 奇怪的问题。。 现在知道原因了么?
2 楼 nishijia 2009-08-05  
laojiang 写道
是数据库有约束条件,不用程序,自己写个sql语句也等按顺序写,你把顺序反过来数据库写报错


有啥解决办法吗  去掉 constraint 都正常

alter table TB_USER
  add constraint FK_T foreign key (PARENTID)
  references TB_PARENT (COL_ID)
1 楼 laojiang 2009-08-05  
是数据库有约束条件,不用程序,自己写个sql语句也等按顺序写,你把顺序反过来数据库写报错

相关推荐

    JDBC基础教程之PreparedStatement.doc

    2. **准备SQL语句**:接着,使用`Connection`对象的`prepareStatement(String sql)`方法创建一个`PreparedStatement`对象,其中`sql`参数是包含占位符的SQL语句。 ```java Connection con = DriverManager.get...

    【IT十八掌徐培成】Java基础第23天-02.sql注入-preparedstatement-批量插入 - 副本.zip

    在IT领域,尤其是在Java编程中,SQL注入是一个重要的安全问题,而PreparedStatement是解决这一问题的有效手段之一。批量插入则是提高数据库操作效率的关键技术。今天我们将深入探讨这两个知识点。 首先,让我们来...

    详解Java的JDBC中Statement与PreparedStatement对象

    在PreparedStatement中,参数是通过它们的顺序引用的,第一个问号对应位置1,第二个对应位置2,以此类推。设置参数值的setXXX()方法与SQL中的预期数据类型相对应。 如同Statement,PreparedStatement也有执行SQL的...

    java 真正的安全的资源的释放

    2. **资源关闭顺序**:建议先关闭`ResultSet`,然后关闭`PreparedStatement`,最后关闭`Connection`。这是因为`PreparedStatement`和`Connection`的关闭操作可能会关闭它们所持有的资源。 3. **异常处理**:在关闭...

    从数据库得到的结果集存放到List集合中

    ResultSet是一个迭代器,可以按顺序访问数据库返回的行。我们可以遍历这个结果集,将每一行的数据转换为Java对象并存入List集合。 ```java List<MyObject> list = new ArrayList(); while (rs.next()) { MyObject ...

    2_JDBC笔记.pdf

    `java.sql.PreparedStatement`是一个预编译的SQL语句对象,它可以提高SQL执行效率,特别是当多次执行相同SQL时。`PreparedStatement`可以接受参数,允许我们在运行时动态插入值。`java.sql.ResultSet`则是用于存储...

    JDBC(用PrepareStatement实现)

    每个问号对应一个参数,参数顺序与SQL语句中的问号位置一致。例如: ```java pstmt.setInt(1, id); pstmt.setString(2, name); ``` 4. **执行SQL语句** 设置完参数后,可以调用executeQuery()或executeUpdate...

    limit传参的使用方法

    在MySQL数据库操作过程中,`LIMIT`子句是非常实用的一个功能,尤其是在需要限制查询结果集大小的情况下。本文将详细介绍如何在MySQL中使用`LIMIT`结合参数化查询来实现灵活且安全的数据检索。 #### 一、基础知识...

    JAVA数据库编程JDBC

    ResultSet是一个迭代器,可以按行遍历数据。每行数据可以使用getter方法获取,如getString()、getInt()等。关闭资源时,要确保按照“资源打开顺序的反序”关闭,即先关闭ResultSet,再关闭Statement,最后关闭...

    java连接数据库的步骤和问题的细节问题

    连接建立后,你可以创建一个`Statement`对象用于执行SQL查询,或者使用`PreparedStatement`对象预编译SQL语句,提高性能并防止SQL注入。 5. **执行SQL操作**: `Statement`或`PreparedStatement`对象提供了`...

    VC++ OCCI 操作 ORACLE

    - 首先,需要创建一个Environment对象,它是所有OCCI对象的基础。Environment::createEnvironment()方法用于创建环境对象,可以设置不同的运行模式,如互斥线程(THREADEC_MUTEXED)或并行线程(THREADEC_UMMUTEXED...

    连接jdbc时sql语句统一设置参数

    压缩包中的`DBParamManage`可能是一个工具类,用于管理或处理与数据库交互时的参数设置。这个类可能会包含一些静态方法,方便在项目中统一处理SQL语句的参数。例如,它可以提供一个通用的方法来设置参数,如下所示...

    Java_JDBC编程总结.pdf

    2. **创建数据库连接**:JDBC驱动程序管理数据库连接,程序员可以通过`DriverManager.getConnection()`方法创建一个到数据库的连接。连接字符串(URL)包含了数据库的类型、服务器地址、端口号、数据库名称等信息。 ...

    JDBC的工具类

    在实际开发中,为了提高代码的可重用性和减少重复性工作,我们通常会创建一个JDBC工具类,将数据库连接、关闭资源等操作封装起来。以下是一个关于JDBC工具类的详细解释。 1. **JDBC工具类的作用** - 提高代码的可...

    Java读取数据库记录并以表格形式显示.rar

    4. ResultSet处理:执行查询后,结果会返回一个ResultSet对象,它是一个游标,可以按顺序访问每一行数据。通过调用`next()`方法移动到下一行,然后可以使用`getString()`, `getInt()`, `getDouble()`等方法获取字段...

    struts原理与实践(三)

    Struts 是一个基于MVC(Model-View-Controller)架构的开源Java框架,主要用于构建企业级Web应用程序。在Struts框架中,开发者可以利用JDBC(Java Database Connectivity)API来与数据库进行交互。本文主要讨论...

    JDBC CRUD操作的粗略封装DEMO

    这个DEMO对于初学者来说是一个很好的实践,通过它,我们可以了解到JDBC操作的基本流程和最佳实践,如使用PreparedStatement防止SQL注入,以及正确关闭资源以避免内存泄漏。同时,封装工具类和回调函数的设计思路也有...

    java调用存储过程[定义].pdf

    每个问号对应一个参数,按照它们在存储过程声明中的顺序进行设置。 4. 执行存储过程:调用CallableStatement的`execute()`方法执行存储过程。 5. 处理结果:根据存储过程的返回类型,可能需要获取输出参数或结果集...

    JDBC查询代码以Student实体类.zip

    本示例"JDBC查询代码以Student实体类.zip"提供了一个简单的JDBC查询应用,涉及到的关键知识点包括: 1. **JDBC驱动注册**:在Java程序中,我们需要通过`Class.forName()`方法加载并注册JDBC驱动。例如,对于MySQL,...

    使用 JDBC 的高级数据库操作

    2. 关闭资源:操作完毕后,需按顺序关闭`ResultSet`、`Statement`和`Connection`,避免资源泄漏。 五、事务管理 1. 开启事务:`Connection.setAutoCommit(false)` 2. 提交事务:`Connection.commit()` 3. 回滚事务...

Global site tag (gtag.js) - Google Analytics