我在Eclipse上运行此代码,几天前我开始与java进行mysql交互...
我真的不明白,当我执行()一个PreparedStatement时,看起来它突破了while循环,也许它抛出一个异常,然后try catch中断,但是有什么方法可以保持循环? / p>
评论是关于我的语言,它只是解释了它的作用。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/base_de_datos_java", "root", "");
System.out.println("Que quieres hacer:\n1º Crear tabla.\n2º Borrar tabla.\n3º Insertar datos en tabla.\n4º Mostrar tablas de la base de datos.\n9º Salir.");
String sentenciaUsarBD = "USE base_de_datos_java;"; // Sentencia SQL para usar la base de datos.
PreparedStatement stUBD = (PreparedStatement) conexion.prepareStatement(sentenciaUsarBD); // Creando la conexion para ejecuta la sentencia
stUBD.execute(); // Ejecuntando la sentencia
int menu = 0;
while (menu != 9) {
Scanner scw = new Scanner(System.in);
menu = scw.nextInt();
switch (menu) {
case 1:
String sqlCrearTabla = "CREATE TABLE ";
String sentenciaSQLCrear = "CREATE TABLE PRUEBA1(ID INT ,NOMBRE VARCHAR(30));";
System.out.println("Esta opción por defecto hace : " + sentenciaSQLCrear);
System.out.println("Deseas usarla? Si o No");
String menu2 = scw.next();
if (menu2.equals("Si")) {
PreparedStatement st = (PreparedStatement) conexion.prepareStatement(sentenciaSQLCrear);
st.execute();
// Parece ser que cada vez que se ejecuta una sentencia sin error cierra el programa
} else {
System.out.println("Que tabla desea crear?");
String nuevaTabla = sc.next();
System.out.println("Que columnas desea crear en la tabla: " + nuevaTabla);
String nuevaColumna = sc.next();
sentenciaSQLCrear = sqlCrearTabla + nuevaTabla + nuevaColumna;
System.out.println(sentenciaSQLCrear);
}
scw.close();
break;
case 2:
String sentenciaSQLBorrar = "DROP TABLE PRUEBA1;";
PreparedStatement str = (PreparedStatement) conexion.prepareStatement(sentenciaSQLBorrar);
str.execute();
scw.close();
break;
case 3:
String sentenciaSQLInsertar = "INSERT INTO prueba1 VALUES(987654321,'Alex');";
PreparedStatement stcf = (PreparedStatement) conexion.prepareStatement(sentenciaSQLInsertar);
stcf.execute();
scw.close();
break;
case 4:
String sentenciaSQLMostrar = "SHOW TABLES FROM base_de_datos_java;";
PreparedStatement stm = (PreparedStatement) conexion.prepareStatement(sentenciaSQLMostrar);
stm.execute();
ResultSet rs = stm.executeQuery();
int num3 = 0;
System.out.println("Tablas de la base de datos");
while (rs.next() == true) {
num3++;
System.out.println(rs.getString(num3));
}
scw.close();
break;
default:
break;
}
System.out.println("\nQue quieres hacer?\n1º Crear tabla.\n2º Borrar tabla.\n3º Insertar datos en tabla.\n4º Mostrar tablas.\n9º Salir.");
}
} catch (SQLException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
答案 0 :(得分:0)
从堆栈跟踪看,它看起来像是在以下行中失败:
menu = scw.nextInt();
Here's扫描程序类的nextInt
方法的javadoc,这就是它所说的:
抛出: NoSuchElementException - 如果输入已用尽
因此,您的代码正在尝试从integer
读取Scanner
,但没有任何内容可供阅读,可能是因为Scanner
已经读取了所有输入令牌。当您使用next()
method阅读令牌时通常会出现这种情况。它从Scanner
读取令牌但不advance
。如果您想要read
和advance
扫描仪,则需要使用nextLine()
代替next()
。
P.S。这与您的PrepearedStatement
逻辑无关。
答案 1 :(得分:0)
我改了很多代码...... 现在每个preparedStatment都在一个不同的try catch循环中,如果它崩溃它只是继续运行。 我正在关闭扫描仪,这在某些时候是问题所在。 它运行良好。