我正在尝试从文件中获取数据并使用java将其插入数据库。以下是我的java代码:
package edgelist;
import java.io.*;
import java.util.*;
import java.lang.Math.*;
import java.sql.*;
public class Edgelist {
private static int getRandomNumberInRange(int min, int max){
if (min >= max) {
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
public static void main(String args[]) throws Exception {
FileInputStream f=null;
int i,c=1;
String num="";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE",
"project",
"project");
Statement stmt=con.createStatement();
String s=null,ver1=null,ver2=null;
int serial=0,type;
//PreparedStatement ps=con.prepareStatement(s);
try {
f=new FileInputStream("F:\\College Project\\dolphin.txt");
do {
i=f.read();
if(i!=-1) {
if((char) i !=' ' && (char) i !='\n' && (char) i !='\r') {
num=num+(char) i;
} else {
if(!num.matches("")) {
if((char) i == ' ') {
//System.out.println("Random:"+getRandomNumberInRange(1, 10)+" "+num);
serial=++c;
ver1=num;
} else if(!((char) i >= '0') && ((char) i <= '9')) {
ver2=num;
}
}
num="";
type=getRandomNumberInRange(1, 10);
s="insert into edges(serial_no, vertex1, vertex2, edge_type)"
+"values("+serial+", '"+ver1+"', '"+ver2+"', "+type+")";
stmt.executeQuery(s);
}
}
} while(i!=-1);
} catch(FileNotFoundException e) {
System.out.println(e);
}
catch(IOException e) {
System.out.println(e);
} finally {
try {
if(f != null)
f.close();
con.close();
} catch(IOException e) {
System.out.println(e);
}
}
}
}
此代码正确地从文件中获取数据但在尝试插入数据库时会出现以下错误
线程“main”java.sql.SQLException中的异常:ORA-00001:唯一 违反约束(PROJECT.SYS_C004002)
在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 在oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)at at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)at at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)at at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)at at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:946) 在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1169) 在 oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1273) 在edgelist.Edgelist.main(Edgelist.java:77)Java结果:1
这是表边结构
CREATE TABLE "EDGES" (
"SERIAL_NO" NUMBER,
"VERTEX1" VARCHAR2(10) NOT NULL ENABLE,
"VERTEX2" VARCHAR2(10) NOT NULL ENABLE,
"EDGE_TYPE" NUMBER,
PRIMARY KEY ("SERIAL_NO") ENABLE,
FOREIGN KEY ("EDGE_TYPE")
REFERENCES "TYPES" ("SERIAL_NO") ENABLE
)
此处TYPES
表包含1到10之间的值,文件dolphin.txt
是包含以下数据的边缘列表:
3 8
5 9
6 9
0 10
2 10
5 13
6 13
9 13
0 14
3 14
0 15
14 16
1 17
6 17
9 17
13 17
15 18
1 19
7 19
8 20
16 20
18 20
18 21
17 22
14 24
15 24
答案 0 :(得分:5)
该错误意味着您正在尝试使用已存在于表中的密钥插入行。
您在SERIAL_NO
上定义了一个主键,并且该字段填充了您的serial
变量,但问题是您并不总是执行serial=++c;
,因为它位于if
声明。
这意味着您可以多次插入相同的serial
值,因此会出现错误。
答案 1 :(得分:0)
在编辑我的逻辑之后,这里的代码完美无缺:
import java.io.*;
import java.util.*;
import java.lang.Math.*;
import java.sql.*;
/**
*
* @author Soumen
*/
public class Edgelist {
private static int getRandomNumberInRange(int min, int max)
{
if (min >= max) {
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
public static void main(String args[]) throws Exception
{
FileInputStream f=null;
int i,c=0,v1_chck=0,v2_chck=0;
String num="";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","project","project");
Statement stmt=con.createStatement();
String s=null,ver1=null,ver2=null;
int serial=0,type;
try
{
f=new FileInputStream("F:\\College Project\\dolphin.txt");
do
{
i=f.read();
if(i!=-1)
{
if((char) i !=' ' && (char) i !='\n' && (char) i !='\r')
{
num=num+(char) i;
}
else
{
if((char) i == ' ')
{
ver1=num;
v1_chck=1;
num="";
}
else
{
if((char) i == '\n')
{
ver2=num;
v2_chck=1;
num="";
}
}
}
if(v1_chck==1 && v2_chck==1)
{
++serial;
type=getRandomNumberInRange(1, 10);
s="insert into edges(serial_no, vertex1, vertex2, edge_type)"
+"values("+serial+", '"+ver1+"', '"+ver2+"', "+type+")";
stmt.executeQuery(s);
v1_chck=0;
v2_chck=0;
}
}
}while(i!=-1);
}
catch(FileNotFoundException e)
{
System.out.println(e);
}
catch(IOException e)
{
System.out.println(e);
}
finally
{
try
{
if(f != null)
f.close();
con.commit();
con.close();
}
catch(IOException e)
{
System.out.println(e);
}
}
}
}
你也可以使用preparedStatement()