【问题标题】:Connect to a user input database连接到用户输入数据库
【发布时间】:2015-05-28 07:40:58
【问题描述】:

我有一个带有字符串参数的 Connect() 方法,这个参数是用户的输入。我创建了 2 个数据库:test 和 test2,但我只能从用户输入连接到 test db。我应该对托管 2 个数据库的服务器进行更改,以便能够连接到用户写入的任何数据库吗???

  public void Connect(String DataBase) {
            try{
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + DataBase);
                st = con.createStatement();
                System.out.println("Connected to " + DataBase + " !!!");
                con.close();
            }catch(SQLException se){
                System.out.println("Cannot connect to database " + DataBase);
            }
            catch(Exception ex){
                System.out.println("Error: " + ex);
            }  
        }

主要方法

   // DB1Connect connect = new DBConnect("test");
    //connect.getData();

    Scanner scanner = new Scanner(System.in);
    System.out.println("Choose from these choices");
    System.out.println("-------------------------\n");
    System.out.println("1 - Connect to a specific DB schema");
    System.out.println("2 - List DB schema structure: tables, fields, types");
    System.out.println("3 - List table structure: fields, types");
    System.out.println("4 - Quit");
    int choice = scanner.nextInt();
     switch(choice) {
         case 1:
             System.out.println("Enter the Db's name:");
             String dbName = scanner.next();
             DBConnect connect = new DBConnect();
             connect.Connect(dbName);
             break;
         case 2:

             break;
         default:
             System.out.println("Incorrect option");
     }
}

堆栈跟踪:

输入数据库的名称:
测试2
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 用户''@'localhost'拒绝访问数据库'test2'
无法连接到数据库 test2
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    在 java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    在 com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    在 com.mysql.jdbc.Util.getInstance(Util.java:381)
    在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
    在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
    在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
    在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910)
    在 com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3923)
    在 com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1273)
    在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031)
    在 com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:718)
    在 com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:46)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    在 java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    在 com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
    在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
    在 java.sql.DriverManager.getConnection(DriverManager.java:664)
    在 java.sql.DriverManager.getConnection(DriverManager.java:270)
    在 medapp.DBConnect.Connect(DBConnect.java:19)
    在 medapp.MedApp.main(MedApp.java:29)

【问题讨论】:

  • 为什么说只能连接test数据库?如果用户输入test2会发生什么?
  • 抛出异常进入这里 catch(SQLException se){ System.out.println("无法连接数据库" + DataBase); }
  • 当输入被测试时,它会打印 Connected to test!!!
  • 如何将se.printStackTrace() 添加到catch 并将完整的堆栈跟踪复制到您的问题?
  • 您在问题下方有一个edit 链接。写“这是堆栈跟踪”之类的内容,然后粘贴堆栈跟踪,然后在其开头添加 <pre> 并在其末尾添加 </pre> 以对其进行格式化。

标签: java mysql


【解决方案1】:

堆栈跟踪告诉您有一个 SQLSyntax 错误。使用它,您可以追溯错误。在这种情况下,StackTrace 中的最后 X2 行:

at medapp.DBConnect.Connect(DBConnect.java:19) at medapp.MedApp.main(MedApp.java:29)

告诉你,使用“main”和“Connect”方法的“medapp”类存在错误。

我是否可以建议您将与数据库的连接包含到彼此不同的类?另一种方法是使用.close() 方法/关闭所有连接。

不同的类


Scanner decision = new Scanner(System.in);
String choice = decision.next();

if(choice.trim().equals("test");
{
    //enter class to connect to "test" table
}
if(choice.trim().equals("test2")
{
    //enter class to connect to "test2" table
}

如果您计划在运行时返回主表或切换表,我建议您在转换之前添加一个 finally 块以关闭连接。


上述方法的替代方法是在主类中设置一个专用于每个连接的方法,并提供一个关闭连接以重新连接的方法。


编辑

根据回复,我强烈建议检查两个表的状态。安装 MySQL Workbench(找到 here)并使用它连接到您的数据库。这应该有助于您调试连接问题。

我还可以建议,检查您的代码并确保您的 SQL 语句中没有拼写错误。

【讨论】:

  • 是的,但这意味着我必须为我拥有的每个数据库添加一个 if stmt,我有点想让用户选择他想要连接的数据库...
  • 我认为问题不是因为连接没有关闭,我启动程序并把第一个test2,没有..
  • 如果您可以连接到其中一个数据库而不是另一个,我建议您查看数据库本身。确保没有身份验证(如果有,请记下它)。如果数据库已联网,请尝试(在 Windows 上)Telnet 以查看服务器是否在线。另外,请查看MySQL's Website,看看您的版本是否支持并发服务器连接。
  • 我以同样的方式创建了 2 个数据库(test 和 test2),只是一个简单的 CREATE DATABASE 测试;创建数据库测试2;没有认证,服务器在线,仍然是服务器不支持并发的可能性...
  • 根据您拥有的许可证,这可能是真的。正如我所说,检查 MySQL 的网站并阅读您拥有的许可证。抱歉回复晚了,我自己在做项目
【解决方案2】:

与服务器建立连接后尝试连接数据库。

  public void Connect(String DataBase) {
            try{
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/");
                st = con.createStatement();
                st.execute("USE " + "[" + DataBase + "]");
                System.out.println("Connected to " + DataBase + " !!!");
                con.close();
            }catch(SQLException se){
                System.out.println("Cannot connect to database " + DataBase);
            }
            catch(Exception ex){
                System.out.println("Error: " + ex);
            }  
        }

数据库是否需要身份验证?如果是这样试试这个:

Properties connProperties;
connProperties = new Properties();
connProperties.setProperty("user", getUsername());
connProperties.setProperty("password",getPassword());

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + DataBase, connProperties);

另外,检查数据库是否存在是个好主意

stat.executeQuery("SELECT * FROM sys.sysdatabases");

【讨论】:

  • 无身份验证,两个数据库都运行在同一个本地服务器上,尝试设置当前数据库的范围,但仍然只有测试通过 con = line
猜你喜欢
  • 2023-03-24
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
相关资源
最近更新 更多