使用java

时间:2017-05-02 10:45:19

标签: java sql oracle jdbc oracle11g

我正在尝试从文件中获取数据并使用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

2 个答案:

答案 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()