0

MySQL で 1 つのテーブルを持つデータベースを作成しました。

CREATE DATABASE iac_enrollment_system;

USE iac_enrollment_system;

CREATE TABLE course(
    course_code CHAR(7),
    course_desc VARCHAR(255) NOT NULL,
    course_chair VARCHAR(255),
    PRIMARY KEY(course_code)
);

次の Java コードを使用して、テーブルにレコードを挿入しています。

// Insert multiple records with user input into a table
// With separate methods

import java.sql.*;
import java.util.*;

class InsertSQL3 {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/iac_enrollment_system";
static final String USER = "root";
static final String PASS = "1234";

static int no_of_records;
static String[] saCourseCode = new String[no_of_records];
static String[] saCourseDesc = new String[no_of_records];
static String[] saCourseChair = new String[no_of_records];

static Connection conn = null;
static Statement stmt = null;

static void getInput() {
    Scanner scn = new Scanner(System.in);
    
    // Get number of records
    System.out.print("How many records do you want to insert? ");
    no_of_records = scn.nextInt();
    scn.nextLine();
    
    // Get values
    for(int i = 0; i < no_of_records; i++) {
        System.out.print("\nEnter course code: ");
        saCourseCode[i] = scn.nextLine();

        System.out.print("Enter course description: ");
        saCourseDesc[i] = scn.nextLine();

        System.out.print("Enter course chair: ");
        saCourseChair[i] = scn.nextLine();
    }
}

static void executeQuery() {
    System.out.print("\nInserting records into table...");
    
    try {
        stmt = conn.createStatement();

        for(int i = 0; i < no_of_records; i++) {
            String sql = "INSERT INTO course(course_code, course_desc, course_chair)" +
                "VALUES(?, ?, ?)";

            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, saCourseCode[i]);
            ps.setString(2, saCourseDesc[i]);
            ps.setString(3, saCourseChair[i]);
            ps.executeUpdate();
        }

    } catch(SQLException se) {
        se.printStackTrace();
    }
        
    System.out.println(" SUCCESS!\n");
}

public static void main(String[] args) {
    try {
        Class.forName("com.mysql.jdbc.Driver");

        System.out.print("\nConnecting to database...");
        conn = DriverManager.getConnection(DB_URL, USER, PASS);
        System.out.println(" SUCCESS!\n");
        
        getInput();
        executeQuery();

    } catch(SQLException se) {
        se.printStackTrace();
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if(stmt != null)
                conn.close();
        } catch(SQLException se) {
        }
        try {
            if(conn != null)
                conn.close();
        } catch(SQLException se) {
            se.printStackTrace();
        }
    }
    System.out.println("Thank you for your patronage!");
  }
}

たとえば、コース コードを入力すると、BSCS-SE次のエラーが返されます。 立入禁止で

なぜ範囲外なのですか?支援をお待ちしております。ありがとうございました。

4

4 に答える 4

1

0Java では数値プリミティブのデフォルト値はであるため、配列saCourseCodeはサイズがゼロの配列であり、値を割り当てることはできません。受け入れた後に配列を初期化するno_of_records

no_of_records = scn.nextInt();
saCourseCode = new String[no_of_records];

これは配列saCourseDescsaCourseChairも適用されます。

編集:

配列を初期化するためのテンプレートを次に示します。一部のコードは省略されていますが、残りは理解できるはずです。

class InsertSQL3 {
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/iac_enrollment_system";
    static final String USER = "root";
    static final String PASS = "***";

    private int noOfRecords;
    private String[] saCourseCode;
    private String[] saCourseDesc;
    private String[] saCourseChair;

    private Connection conn = null;
    private Statement stmt = null;

    private Scanner scn;

    public InsertSQL3() {
        scn = new Scanner(System.in);
    }

    private void initConnection() {
       ...
    }

    private void getInput() {

        // Get number of records
        System.out.print("How many records do you want to insert? ");
        noOfRecords = Integer.parseInt(scn.nextLine());

        saCourseCode = new String[noOfRecords];
        saCourseDesc = new String[noOfRecords];
        saCourseChair = new String[noOfRecords];

        ...
    }

    private void executeQuery() {
         ...
    }



    public static void main(String[] args) {
        InsertSQL3 insertApp = new InsertSQL3();
        insertApp.initConnection();
        insertApp.getInput();
        insertApp.executeQuery();

        System.out.println("Thank you for your patronage!");
    }
}
于 2013-08-18T09:14:46.223 に答える
1

配列は常に長さがゼロになります。

static int no_of_records;
static String[] saCourseCode = new String[no_of_records];
static String[] saCourseDesc = new String[no_of_records];
static String[] saCourseChair = new String[no_of_records];

配列はすぐに作成され、長さは fromno_of_recordsになります。これはもちろん、配列0に何も割り当てておらず、Java がデフォルト値のintto を設定しているためです0

コンパイラがそれについて警告しなかったとしたら、私はかなり驚かれることでしょう。

レコードの数がわかっている場合にのみ配列を作成します。

個別に: これには変数を使用しないことを強くお勧めします。staticこれは、インスタンスにラップする必要がある種類のものです。

于 2013-08-18T09:15:16.050 に答える
1

Aは、値が割り当てられるまでstatic intは初期状態です。0配列のサイズがわかったら、次のように配列を作成する必要があります。

static void getInput() {
    Scanner scn = new Scanner(System.in);

    // Get number of records
    System.out.print("How many records do you want to insert? ");
    no_of_records = scn.nextInt();
    scn.nextLine();

    // Now we know how many records we need to handle!
    String[] saCourseCode = new String[no_of_records];
    String[] saCourseDesc = new String[no_of_records];
    String[] saCourseChair = new String[no_of_records];

    // Get values
    for(int i = 0; i < no_of_records; i++) {
于 2013-08-18T09:19:46.550 に答える
0
static int no_of_records;
static String[] saCourseCode = new String[no_of_records];

is equivalent to

static int no_of_records = 0;
static String[] saCourseCode = new String[no_of_records];

So, all your arrays have a length of 0. no_of_records is only initialized after, in the getInput() method. Initialize the arrays after no_of_records has been initialized.

And please respect the Java naming conventions.

于 2013-08-18T09:17:11.727 に答える