java 为什么“未选择数据库”SQLException?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/584870/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Why ‘No database selected’ SQLException?
提问by
why this program is not executing when it goes in to the do while loop second time and why it is giving the exception "Exception java.sql.SQLException: [MySQL][ODBC 5.1 Driver][mysqld-5.0.51a-community-nt]No database selected"
为什么这个程序在第二次进入 do while 循环时没有执行,为什么它给出异常“异常 java.sql.SQLException:[MySQL][ODBC 5.1 驱动程序][mysqld-5.0.51a-community-nt ]没有选择数据库”
//import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
import java.util.Vector;
public class DataBase {
public void LoadDriver() {
// Load the JDBC-ODBC bridge driver
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException ee) {
ee.printStackTrace();
}
}
// 2.open a data source name by means of the jdbcodbcdriver.
static void connect() throws SQLException {
// Connect to the database
Connection con = DriverManager.getConnection("jdbc:odbc:MySQL", "root", "admin");
Statement stmt = con.createStatement();
// Shut off autocommit
con.setAutoCommit(false);
System.out.println("1.Insert 2.Delete 3.Update 4.Select");
Scanner s = new Scanner(System.in);
int x;
x = s.nextInt();
String query; // SQL select string
ResultSet rs; // SQL query results
boolean more; // "more rows found" switch
String v1, v2; // Temporary storage results
Vector<Object> results = new Vector<Object>(10);
if (x == 1) {
try {
stmt.executeUpdate("INSERT INTO employee( emp_id,emp_name ) VALUES ( '122','shiva' ) ");
} catch(Exception e){System.out.println("Exception " +e);e.printStackTrace();}
}
if (x == 2) {
try {
stmt.executeUpdate("DELETE from employee where emp_id='102' ");
}catch(Exception e){System.out.println("Exception "+e);e.printStackTrace();}
}
if (x == 3) {
try {
stmt
.executeUpdate("UPDATE employee SET emp_name = 'madavan' where emp_id='20'; ");
} catch(Exception e){System.out.println("Exception "+e);e.printStackTrace();}
}
query = "SELECT * FROM employee ";
try {
rs = stmt.executeQuery(query);
// Check to see if any rows were read
more = rs.next();
if (!more) {
System.out.println("No rows found.");
return;
}
// Loop through the rows retrieved from the query
while (more) {
v1 = "ID: " + rs.getInt("emp_id");
v2 = "Name: " + rs.getString("emp_name");
System.out.println(v1);
System.out.println(v2);
System.out.println("");
results.addElement(v1 + "\n" + v2 + "\n");
more = rs.next();
}
rs.close();
} catch (SQLException e) {
System.out.println("" + results.size() + "results where found.");
}
finally{stmt.close();}
}
public static void main(String[] args) throws SQLException {
String str = "y";
do {
DataBase s = new DataBase();
s.LoadDriver();
DataBase.connect();
Scanner sc = new Scanner(System.in);
System.out.println("DO u Want to PROCEED TO QUERY : ");
str = sc.next();
} while (str !="n");
}
}
回答by Clint
Unless you have to use the jdbc/odbc driver I would use the straight mysql jdbc driver. You can download it free from mysql.
除非您必须使用 jdbc/odbc 驱动程序,否则我将使用直接的 mysql jdbc 驱动程序。您可以从 mysql 免费下载它。
then
然后
public void LoadDriver() {
// Load the JDBC-ODBC bridge driver
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException ee) {
ee.printStackTrace();
}
}
static void connect() throws SQLException {
// Connect to the database
Connection con = DriverManager.getConnection("jdbc:mysql:host/databasename", "root", "admin");
Statement stmt = con.createStatement();
...
回答by markt
Just from looking at the exception.. I would guess that you are not specifying the database. How can you do a select on a table without telling it which schema to select from ? This is typically set in the connection string..
仅从异常来看.. 我猜你没有指定数据库。如何在不告诉它从哪个模式中选择的情况下对表进行选择?这通常在连接字符串中设置..
回答by bobince
Is the ODBC source actually set up to select a database? eg. can you access the database through another ODBC client tool?
ODBC 源是否实际设置为选择数据库?例如。您可以通过另一个 ODBC 客户端工具访问数据库吗?
If you need to select a database explicitly in the JDBC string you can do that using the ‘database' parameter.
如果您需要在 JDBC 字符串中明确选择一个数据库,您可以使用 'database' 参数来完成。
But having the database chosen in the ODBC setup would be more usual. And indeed, as Clint mentioned, using the normal MySQL JDBC driver instead of ODBC would be more usual still.
但是在 ODBC 设置中选择数据库会更常见。事实上,正如 Clint 所提到的,使用普通的 MySQL JDBC 驱动程序而不是 ODBC 会更常见。
while (str !="n")
而 (str !="n")
回答by toad
Found a bug listing at MySQLthat gives this error but with different technologies. However, in the description it indicates that it is related to reauthorization not sending the database information, so perhaps that is what you are encountering here as well.
在 MySQL上发现了一个错误列表,它给出了这个错误,但使用了不同的技术。但是,在描述中它表明它与不发送数据库信息的重新授权有关,所以也许这也是您在这里遇到的情况。
Some things that stick out as odd to me (although no clue if they will have any impact on your error)
有些事情对我来说很奇怪(尽管不知道它们是否会对您的错误产生任何影响)
- You only need to load the Driver Manager once
- You aren't closing your connection, so either close it or refactor to use the same one.
- 您只需要加载一次驱动管理器
- 您没有关闭连接,因此要么关闭它,要么重构以使用相同的连接。
Perhaps move these two lines to just before the doloop
也许将这两行移动到do循环之前
DataBase s = new DataBase();
s.LoadDriver();

